2009-11-29 2 views
56

Mã này sẽ mở ra các url và gắn thêm các /names ở cuối và mở trang và in chuỗi để test1.csv:Tại sao csvwriter.writerow() đặt dấu phẩy sau mỗi ký tự?

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 đến ("JD", "Trường Luật Columbia" ....) sau đó tôi nhận được

JD, Columbia Law School...)

Tôi không thể tìm thấy trong tài liệu hướng dẫn cách chỉ định dấu phân cách.

Nếu tôi cố gắng sử dụng delimenter tôi nhận được lỗi này:

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

Thanks for the help.

+8

Đó là 'delimiter' và không' delimeter': http: //docs.python. org/library/csv.html –

Trả lời

90

Dự kiến ​​một chuỗi (ví dụ: danh sách hoặc bộ dữ liệu) của chuỗi. Bạn đang cho nó một chuỗi duy nhất. Một chuỗi xảy ra là một chuỗi các chuỗi quá, nhưng đó là một chuỗi gồm 1 chuỗi 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 mỗi hàng bạn có thể làm một cái gì đó như thế này:

csvwriter.writerow([JD]) 

này kết thúc tốt đẹp JD (một chuỗi) với một danh sách.

+0

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

+0

Vẫn còn hữu ích :) – PhilipB

+1

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

1

Điều này xảy ra, bởi vì khi phương thức group() của một thể hiện MatchObject chỉ trả về một giá trị duy nhất, nó 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 chuỗi các 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 vượt qua một chuỗi đơn (có thể lặp lại), nó lặp lại qua các ký tự của nó, tạo ra kết quả bạn đang quan sát. Nếu bạn vượt qua một chuỗi các chuỗi, nó sẽ nhận được một chuỗi thực, không phải là một ký tự đơn trên mỗi lần lặp.

5

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

Để khắc phục điều này, bạn có thể chia giá trị dựa trên khoảng trắng (Tôi giả định đó là những gì bạn muốn)

csvwriter.writerow(JD.split())