为什么Python CSV读取器忽略双引号包裹的字段?

22

我认为这可能是一件简单的事情,但经过一个小时的搜索,我仍然没有找到我做错了什么。

我正在使用以下代码读取一个CSV文件 - 我没有问题读取文件,但当一行包含由于包含分隔符而被双引号括起来的字段时,CSV阅读器会忽略双引号并将该字段解析为2个单独的字段。

这是我正在使用的代码:

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。谢谢!

2个回答

31

如果你查看所使用的方言,你会注意到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。只需将其传递给你的reader即可。 顺便提一句,当使用excel方言时,默认的字段就是你传递的所有字段,因为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

5

这是因为您的CSV文件在引号之前有空格:

one0, one1, one2
two0, two1, two2
tre0, "tr,e1", tre2

vs

one0,one1,one2
two0,two1,two2
tre0,"tr,e1",tre2

首先,您需要先去掉那些额外的空格。


2
这是错误的:csv.reader()skipinitialspace 选项来处理那些空格。 - MERose

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接