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

2024-05-13 17:11:53 发布

您现在位置:Python中文网/ 问答频道 /正文

这段代码打开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”,“哥伦比亚法学院”…),那么我会得到

JD, Columbia Law School...)

我在文档中找不到如何指定delimeter。

如果我试图使用delimenter,则会出现以下错误:

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

谢谢你的帮助。


Tags: csv字符串importreurlforresponseurllib2
3条回答

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

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

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

如果每行只需要一个字符串,可以执行以下操作:

csvwriter.writerow([JD])

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

csv.writer类接受一个iterable作为writerow的参数;由于Python中的字符串是按字符iterable的,所以它们是writerow可以接受的参数,但是您可以得到上面的输出。

要纠正这个问题,可以基于空白分割值(我假设这是您想要的)

csvwriter.writerow(JD.split())

相关问题 更多 >