为啥 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?