为什么Python CSV阅读器忽略双引号字段?

Jam*_*mey 17 python csv

我认为这可能是一件简单的事情,但经过一个小时的搜索,我没有运气弄清楚我做错了什么.

我正在使用以下代码来读取CSV文件 - 我在读取文件时没有问题,但是当一行包含双引号的字段因为它包含分隔符时,CSV阅读器会忽略双引号并解析字段分为2个单独的字段.

这是我正在使用的代码:

myReader = csv.reader(open(inPath, 'r'), dialect='excel', delimiter=',', quotechar='"')
for row in myReader:
    print row,
    print len(row)
Run Code Online (Sandbox Code Playgroud)

我的意见:

hello, this is row 1, foo1
hello, this is row 2, foo2
goodbye, "this, is row 3", foo3
Run Code Online (Sandbox Code Playgroud)

这给了我:

['hello', ' this is row 1', ' foo1'] 3
['hello', ' this is row 2', ' foo2'] 3
['goodbye', ' "this', ' is row 3"', ' foo3'] 4
Run Code Online (Sandbox Code Playgroud)

我需要更改什么才能将双引号字段识别为一个字段?我正在使用python 2.6.1版.

谢谢!

Mah*_*der 28

如果你看一下你正在使用的方言,你会发现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
Run Code Online (Sandbox Code Playgroud)

请注意,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
Run Code Online (Sandbox Code Playgroud)


Tor*_*ler 5

这是因为您的 csv 在引号前有空格:

one0, one1, one2
two0, two1, two2
tre0, "tr,e1", tre2
Run Code Online (Sandbox Code Playgroud)

对比

one0,one1,one2
two0,two1,two2
tre0,"tr,e1",tre2
Run Code Online (Sandbox Code Playgroud)

您需要先删除这些多余的空格。

  • 这是错误的:“csv.reader()”具有“skipinitialspace”选项来处理这些空白。 (2认同)