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

131 投票
4 回答
116491 浏览
提问于 2025-04-15 16:30

这段代码的作用是打开一个网址,然后在网址后面加上 /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(一个字符串)放进了一个列表里。

撰写回答