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

Posted

技术标签:

【中文标题】为啥 csvwriter.writerow() 在每个字符后加一个逗号?【英文标题】:Why does csvwriter.writerow() put a comma after each character?为什么 csvwriter.writerow() 在每个字符后加一个逗号? 【发布时间】:2010-12-21 11:21:36 【问题描述】:

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

【问题讨论】:

这是delimiter 而不是delimeter: docs.python.org/library/csv.html 如果您在 writer.writerows 中遇到此问题,请将列表传递给它,而不是字符串列表。 【参考方案1】:

换一种说法 - 如果您在整个输出周围添加方括号,它将被视为一个项目,因此不会添加逗号。例如而不是:

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

使用:

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

【讨论】:

【参考方案2】:

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

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

csvwriter.writerow(JD.split())

【讨论】:

【参考方案3】:

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

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

【讨论】:

【参考方案4】:

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

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

csvwriter.writerow([JD])

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

【讨论】:

谢谢!这解决了它。我也会尝试其他答案。我还创建了一个空列表 JDList=[] 并将 JD 附加到该列表中,这也可以,但这更简单。 现在它还写字符串的引号。有办法解决吗? @CGFoX 你能发布示例代码来演示这个吗? writer.writerow([datetime.now().strftime("%Y-%m-%d %H:%M:%S")]) 将日期时间写入"2016-11-05 20:30:19" 我认为问题在于字符串中有一个空格并使用空格作为作者的分隔符。当我尝试编写[datetime.now().strftime("%Y-%m-%d_%H:%M:%S")](即没有空格)时,它运行良好且没有引号。所以它与您的解决方案无关 - 它工作正常!

以上是关于为啥 csvwriter.writerow() 在每个字符后加一个逗号?的主要内容,如果未能解决你的问题,请参考以下文章

aiohttp.client_exceptions.ContentTypeError: 0:json(content_type=‘??‘)

为啥临时变量需要更改数组元素以及为啥需要在最后取消设置?

为啥在参数周围使用 /*、*/ 以及为啥在提取数组长度时使用 >>>? [复制]

为啥 CoreGui Roblox 锁定在 DataModel 中,为啥受信任的用户不能使用 CoreScripts?

为啥 + 仅在客户端是 NaN?为啥不在 Node.js 中?

在执行语义分割任务时我应该减去图像均值吗?为啥或者为啥不?