为什么csvwriter.writerow()会在每个字符后加逗号?
这段代码的作用是打开一个网址,然后在网址后面加上 /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
4 个回答
3
这个情况发生是因为,当一个MatchObject实例的group()方法只返回一个值时,它会以字符串的形式返回。如果返回多个值,它们会以字符串的元组形式返回。
如果你在写一行数据,我想csv.writer会对你传给它的对象进行逐个处理。如果你传入一个单独的字符串(这是一种可迭代的对象),它会逐个处理这个字符串中的每个字符,这就是你看到的结果。如果你传入的是一个字符串的元组,它会在每次迭代中得到一个完整的字符串,而不是每次只得到一个字符。
13
csv.writer类在写入一行数据时,需要一个可迭代的对象作为参数。Python中的字符串是可以按字符进行迭代的,所以你可以把字符串传给writerow,但这样会得到你上面看到的输出。
为了修正这个问题,你可以根据空格来拆分这个值(我假设你是想这样做)。
csvwriter.writerow(JD.split())
196
它需要的是一串字符串(比如:列表或元组)。而你给的是一个单独的字符串。虽然字符串本身也是一种字符串序列,但它实际上是由一个个字符组成的序列,这并不是你想要的。
如果你只是想每行一个字符串,可以这样做:
csvwriter.writerow([JD])
这段代码把JD(一个字符串)放进了一个列表里。