Mengapa csvwriter.writerow () memberi tanda koma setelah setiap karakter?

98

Kode ini membuka url dan menambahkan /namesdi akhir dan membuka halaman dan mencetak string ke 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)

Tapi saya mendapatkan hasil ini:

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

Jika saya mengubah string menjadi ("JD", "Columbia Law School" ....) maka saya dapatkan

JD, Columbia Law School...)

Saya tidak bisa menemukan di dokumentasi bagaimana menentukan pembatas.

Jika saya mencoba menggunakan delimentersaya mendapatkan kesalahan ini:

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

Terima kasih untuk bantuannya.

Zeynel
sumber
8
Ini delimiterdan bukan delimeter: docs.python.org/library/csv.html
John Paulett
Jika Anda mendapatkan masalah ini dengan writer.writerow s , berikan daftar daftar dan bukan daftar string.
Noumenon

Jawaban:

149

Ia mengharapkan urutan (misalnya: daftar atau tupel) string. Anda memberikannya satu string. Sebuah string kebetulan juga merupakan urutan string, tetapi itu adalah urutan string 1 karakter, yang bukan yang Anda inginkan.

Jika Anda hanya ingin satu string per baris, Anda dapat melakukan sesuatu seperti ini:

csvwriter.writerow([JD])

Ini membungkus JD (string) dengan daftar.

Laurence Gonsalves
sumber
Terima kasih! Ini memperbaikinya. Saya akan mencoba jawaban lain juga. Saya juga membuat daftar kosong JDList = [] dan menambahkan JD ke sana, yang juga berfungsi tetapi ini lebih sederhana.
Zeynel
1
Sekarang juga menulis tanda kutip dari string tersebut. Apakah ada jalan keluarnya?
CGFoX
@CGFoX Dapatkah Anda memposting kode contoh yang menunjukkan ini?
Laurence Gonsalves
writer.writerow([datetime.now().strftime("%Y-%m-%d %H:%M:%S")])menulis tanggal waktu sebagai"2016-11-05 20:30:19"
CGFoX
@CGFoX Saya tidak dapat mereproduksi perilaku itu. Saya mendapatkan 2016-11-05 13:21:11tanpa kutipan. Versi Python apa yang Anda gunakan?
Laurence Gonsalves
5

Kelas csv.writer melakukan iterable sebagai argumennya ke writerow; karena string dalam Python dapat diulang menurut karakter, mereka adalah argumen yang dapat diterima untuk writerow, tetapi Anda mendapatkan keluaran di atas.

Untuk memperbaikinya, Anda dapat membagi nilai berdasarkan spasi (saya berasumsi itulah yang Anda inginkan)

csvwriter.writerow(JD.split())
Gabriel Reid
sumber
1

Ini terjadi, karena ketika metode group () dari instance MatchObject hanya mengembalikan satu nilai, ia mengembalikannya sebagai string. Jika ada beberapa nilai, nilai tersebut dikembalikan sebagai tupel string.

Jika Anda menulis sebuah baris, saya kira, csv.writer mengulang objek yang Anda berikan padanya. Jika Anda melewatkan satu string (yang merupakan sebuah iterable), ia mengulangi karakternya, menghasilkan hasil yang Anda amati. Jika Anda meneruskan tupel string, string tersebut akan mendapatkan string yang sebenarnya, bukan karakter tunggal pada setiap iterasi.

shylent
sumber