为什么 csvwriter.writerow()在每个字符后面加一个逗号?

这段代码打开 URL 并在末尾追加 /names,然后打开页面并将字符串打印到 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)

但我得到了这样的结果:

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

如果我把字符串改为(“ JD”,“ Columbia Law School”... .) ,那么我得到

JD, Columbia Law School...)

我在文档中找不到指定分界线的方法。

如果我尝试使用 delimeter,我会得到这个错误:

TypeError: 'delimeter' is an invalid keyword argument for this function
103972 次浏览

它需要一个字符串序列(例如: 列表或元组)。你只给了它一根线。字符串碰巧也是一个字符串序列,但它是一个字符串序列,这不是您想要的。

如果你只想要每行一个字符串,你可以这样做:

csvwriter.writerow([JD])

这用一个列表来包装 JD (一个字符串)。

之所以会发生这种情况,是因为当 MatchObject 实例的 group ()方法只返回一个值时,它将以字符串的形式返回该值。当有多个值时,它们作为字符串元组返回。

如果您正在编写一行,我猜,csv.writer 会遍历您传递给它的对象。如果您传递一个字符串(它是可迭代的) ,它将迭代其字符,生成您正在观察的结果。如果你传递一个字符串元组,它会得到一个实际的字符串,而不是每次迭代中的一个字符。

Writer 类接受一个 iterable 作为 Writerow 的参数; 因为 Python 中的字符串是按字符进行迭代的,所以它们对 writerow 来说是一个可接受的参数,但是您可以得到上面的输出。

为了纠正这个问题,您可以根据空格分割值(我假设这就是您想要的)

csvwriter.writerow(JD.split())

换句话说——如果在整个输出周围添加方括号,它将被视为一个项,因此不会添加逗号。例如:

spamwriter.writerow(matrix[row]['id'],matrix[row]['value'])

用途:

spamwriter.writerow([matrix[row]['id'] + ',' + matrix[row]['value']])