我认为这可能很简单,但经过一个小时的搜索后,我一直没弄清楚我做错了什么。
我正在使用以下代码读取CSV文件 - 我在读取文件时没有问题,但是当一行包含双引号的字段,因为它包含分隔符时,CSV阅读器会忽略双引号并将该字段解析为两个单独的字段。
这是我正在使用的代码:
myReader = csv.reader(open(inPath, 'r'), dialect='excel', delimiter=',', quotechar='"')
for row in myReader:
print row,
print len(row)
我的意见:
hello, this is row 1, foo1
hello, this is row 2, foo2
goodbye, "this, is row 3", foo3
这给了我:
['hello', ' this is row 1', ' foo1'] 3
['hello', ' this is row 2', ' foo2'] 3
['goodbye', ' "this', ' is row 3"', ' foo3'] 4
我需要更改什么才能将双引号字段识别为一个字段? 我正在使用python版本2.6.1。
谢谢!
答案 0 :(得分:26)
如果你看一下你正在使用的方言,你会发现excel方言是 配置如下:
class excel(Dialect):
"""Describe the usual properties of Excel-generated CSV files."""
delimiter = ','
quotechar = '"'
doublequote = True
skipinitialspace = False
lineterminator = '\r\n'
quoting = QUOTE_MINIMAL
请注意skipinitialspace
设置为False。把它传递给你的读者吧。
哦,顺便说一句,你传入的所有字段都是默认值
使用excel
方言,这是传递给csv.reader
所以,我会像这样重写你的代码:
>>> with open(inPath) as fp:
>>> reader = csv.reader(fp, skipinitialspace=True)
>>> for row in reader:
>>> print row,
>>> print len(row)
['hello', 'this is row 1', 'foo1'] 3
['hello', 'this is row 2', 'foo2'] 3
['goodbye', 'this, is row 3', 'foo3'] 3
答案 1 :(得分:5)
这是因为你的csv在引号之前有空格:
one0, one1, one2
two0, two1, two2
tre0, "tr,e1", tre2
VS
one0,one1,one2
two0,two1,two2
tre0,"tr,e1",tre2
您需要先删除这些额外的空格。
答案 2 :(得分:-1)
如果要在内容中添加引号,则必须将其转义。用双引号将双引号转义。
因此,这应该变成类似
再见,'“”这是第3行“”',foo3
欢呼声,罗德