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

23 投票
2 回答
35440 浏览
提问于 2025-04-16 22:33

我觉得这可能是个简单的问题,但我搜索了一个小时,还是没搞明白我哪里出错了。

我正在用以下代码来读取一个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版本。

谢谢!

2 个回答

5

这是因为你的csv文件在引号前面有空格:

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

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

你需要先把那些多余的空格去掉。

32

如果你看看你正在使用的方言(这里指的是数据格式),你会发现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

撰写回答