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


97

此代码打开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...)

我在文档中找不到如何指定分度符。

如果我尝试使用delimenter,则会出现此错误:

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

谢谢您的帮助。


8
delimiter不是delimeterdocs.python.org/library/csv.html
John Paulett 09年

如果使用writer.writerow s遇到此问题,请将列表列表而不是字符串列表传递给它。
Noumenon

Answers:


148

它需要一个字符串序列(例如:列表或元组)。您给它一个字符串。一个字符串也恰好是一个字符串序列,但是它是一个由1个字符串组成的序列,这不是您想要的。

如果您只希望每行一个字符串,则可以执行以下操作:

csvwriter.writerow([JD])

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


谢谢!这样就解决了。我也会尝试其他答案。我还创建了一个空列表JDList = []并将JD附加到该列表中,该列表也可以工作,但这更简单。
Zeynel

1
现在,它还会写出字符串的引号。有办法解决吗?
CGFoX

@CGFoX您可以发布示例代码来演示这一点吗?
劳伦斯·贡萨尔维斯

writer.writerow([datetime.now().strftime("%Y-%m-%d %H:%M:%S")])将日期时间写为"2016-11-05 20:30:19"
CGFoX

@CGFoX我无法重现该行为。我2016-11-05 13:21:11没有报价。您正在使用哪个版本的Python?
劳伦斯·贡萨尔维斯

5

csv.writer类将一个可迭代的参数作为writerow的参数。由于Python中的字符串可以按字符进行迭代,因此它们是writerow可接受的参数,但是您会得到上面的输出。

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

csvwriter.writerow(JD.split())

1

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

如果您要写一行,我想csv.writer会遍历传递给它的对象。如果传递单个字符串(可迭代),则会对其字符进行迭代,从而产生您正在观察的结果。如果传递字符串的元组,它将获得实际的字符串,而不是每次迭代都包含单个字符。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.