Tại sao csvwriter.writerow () lại đặt dấu phẩy sau mỗi ký tự?


97

Mã này mở url và nối /namesvào cuối và mở trang và in chuỗi thành 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)

Nhưng tôi nhận được kết quả này:

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

Nếu tôi thay đổi chuỗi thành ("JD", "Trường Luật Columbia" ....) thì tôi nhận được

JD, Columbia Law School...)

Tôi không thể tìm thấy trong tài liệu cách chỉ định máy đo mê sảng.

Nếu tôi cố gắng sử dụng, delimentertôi gặp lỗi này:

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

Cảm ơn đã giúp đỡ.


8
Đó là delimiterkhông delimeter: docs.python.org/library/csv.html
John Paulett

Nếu bạn gặp sự cố này với writer.writerow s , hãy chuyển nó vào danh sách các danh sách chứ không phải danh sách các chuỗi.
Noumenon

Câu trả lời:


148

Nó mong đợi một chuỗi (ví dụ: một danh sách hoặc bộ) các chuỗi. Bạn đang cho nó một chuỗi duy nhất. Một chuỗi cũng là một chuỗi các chuỗi, nhưng đó là một chuỗi gồm 1 ký tự, không phải là những gì bạn muốn.

Nếu bạn chỉ muốn một chuỗi trên mỗi hàng, bạn có thể làm như sau:

csvwriter.writerow([JD])

Điều này kết thúc JD (một chuỗi) với một danh sách.


Cảm ơn! Điều này đã sửa nó. Tôi cũng sẽ thử các câu trả lời khác. Tôi cũng đã tạo một danh sách trống JDList = [] và thêm JD vào đó, điều đó cũng hoạt động nhưng điều này đơn giản hơn.
Zeynel

1
Bây giờ nó cũng viết dấu ngoặc kép của chuỗi. Có cách nào để giải quyết vấn đề đó không?
CGFoX

@CGFoX Bạn có thể đăng mã ví dụ minh họa điều này không?
Laurence Gonsalves

writer.writerow([datetime.now().strftime("%Y-%m-%d %H:%M:%S")])viết datetime là"2016-11-05 20:30:19"
CGFoX, 5/11/16

@CGFoX Tôi không thể tái tạo hành vi đó. Tôi nhận được 2016-11-05 13:21:11mà không có dấu ngoặc kép. Bạn đang sử dụng phiên bản Python nào?
Laurence Gonsalves

5

Lớp csv.writer nhận một có thể lặp lại vì nó là đối số để writerow; vì các chuỗi trong Python có thể lặp lại theo ký tự, chúng là đối số có thể chấp nhận được để writerow, nhưng bạn nhận được kết quả ở trên.

Để sửa lỗi này, bạn có thể phân chia giá trị dựa trên khoảng trắng (tôi cho rằng đó là điều bạn muốn)

csvwriter.writerow(JD.split())

1

Điều này xảy ra, bởi vì khi phương thức group () của một đối tượng MatchObject chỉ trả về một giá trị duy nhất, nó sẽ trả về nó dưới dạng một chuỗi. Khi có nhiều giá trị, chúng được trả về dưới dạng một bộ chuỗi.

Nếu bạn đang viết một hàng, tôi đoán, csv.writer lặp lại đối tượng bạn chuyển cho nó. Nếu bạn truyền một chuỗi đơn (là một chuỗi có thể lặp lại), nó sẽ lặp lại các ký tự của nó, tạo ra kết quả mà bạn đang quan sát. Nếu bạn truyền một bộ chuỗi, nó sẽ nhận được một chuỗi thực, không phải một ký tự duy nhất trên mỗi lần lặp.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.