Csvwriter.writerow () neden her karakterden sonra virgül koyar?


98

Bu kod url'yi açar ve sonuna ekler /names, sayfayı açar ve dizeyi şuraya yazdırır test1.csv:

import urllib2
import re
import csv

url = ("http://www.example.com")
bios = [u'/name1', u'/name2', u'/name3']
csvwriter = csv.writer(open("/test1.csv", "a"))

for l in bios:
    OpenThisLink = url + l
    response = urllib2.urlopen(OpenThisLink)
    html = response.read()
    item = re.search('(JD)(.*?)(\d+)', html)
    if item:
        JD = item.group()
        csvwriter.writerow(JD)
    else:
        NoJD = "NoJD"
        csvwriter.writerow(NoJD)

Ama şu sonucu alıyorum:

J,D,",", ,C,o,l,u,m,b,i,a, ,L,a,w, ,S,c,h,o,o,l,....

Dizeyi ("JD", "Columbia Hukuk Okulu" ....) olarak değiştirirsem,

JD, Columbia Law School...)

Sınırlamayı nasıl belirteceğimi dokümantasyonda bulamadım.

Kullanmaya çalışırsam delimenterşu hatayı alıyorum:

TypeError: 'delimeter' is an invalid keyword argument for this function

Yardım için teşekkürler.


8
Öyle delimiterve değil delimeter: docs.python.org/library/csv.html
John

1
Bu sorunu writer.writerow s ile alıyorsanız , dizge listesi yerine bir liste listesi verin.
Noumenon

Yanıtlar:


152

Bir dizge dizisi (örneğin: bir liste veya tuple) bekler. Ona tek bir ip veriyorsun. Bir dize de bir dizi dizedir, ancak bu 1 karakter dizisinden oluşan bir dizidir, ki bu istediğiniz şey değildir.

Satır başına yalnızca bir dize istiyorsanız, şöyle bir şey yapabilirsiniz:

csvwriter.writerow([JD])

Bu, JD'yi (bir dize) bir listeyle sarar.


Teşekkürler! Bu onu düzeltti. Diğer cevapları da deneyeceğim. Ayrıca boş bir JDList = [] listesi oluşturdum ve buna JD ekledim, bu da çalışıyor, ancak bu daha basit.
Zeynel

1
Artık dizenin tırnak işaretlerini de yazıyor. Bunun bir yolu var mı?
CGFoX

@CGFoX Bunu gösteren örnek bir kod gönderebilir misiniz?
Laurence Gonsalves

writer.writerow([datetime.now().strftime("%Y-%m-%d %H:%M:%S")])tarih"2016-11-05 20:30:19"
saati

@CGFoX Bu davranışı yeniden oluşturamıyorum. 2016-11-05 13:21:11Alıntılar olmadan alıyorum . Python'un hangi sürümünü kullanıyorsunuz?
Laurence Gonsalves

6

Csv.writer sınıfı, writerow'a argüman olarak yinelenebilir bir sınıf alır; Python'daki dizeler karakter olarak yinelenebilir olduğundan, bunlar yazma için kabul edilebilir bir argümandır, ancak yukarıdaki çıktıyı alırsınız.

Bunu düzeltmek için, değeri beyaz boşluğa göre bölebilirsin (istediğinin bu olduğunu varsayıyorum)

csvwriter.writerow(JD.split())

1

Bu olur, çünkü MatchObject örneğinin group () yöntemi yalnızca tek bir değer döndürdüğünde, onu bir dize olarak döndürür. Birden çok değer olduğunda, bunlar bir dizi dizisi olarak döndürülür.

Bir satır yazıyorsanız, csv.writer ona ilettiğiniz nesneyi yineler sanırım. Tek bir dizge (yinelenebilir olan) geçirirseniz, karakterleri üzerinde yineler ve gözlemlediğiniz sonucu üretir. Bir dizi dizeyi iletirseniz, her yinelemede tek bir karakter değil, gerçek bir dize alır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.