8

我的印象是这是一个常见问题,我有一个 csv 文件,字段中有换行符。我正在寻找 Python 中的修复程序——如果可能的话,也在 csv 模块中。

这是我创建的示例文件

$ more test_csv.csv
a,"b",c,d,"e
e
e",f
a,bb,c,d,ee ,"f
f"
a,b,"c
c",d,e,f

并不是所有的字段都用引号括起来(虽然在这个例子中我的使用是随机的,实际文件应该匹配 quoting=csv.QUOTE_MINIMAL)

输出应该类似于

[[a,b,c,d,"e\ne\ne",f],[a,bb,c,d,ee,"f\nf"][a,b,"c\nc",d,e,f]]

相反,我得到

[[['a', 'b', 'c', 'd', 'e\n']], [['e']], [['e"', 'f']], [['a', 'bb', 'c', 'd', 'ee ', 'f\n']], [['f"']], [['a', 'b', 'c\n']], [['c"', 'd', 'e', 'f']]]

请关注行数和列数。另一个担忧是,在第三行中,包含了不应该包含的报价。

到目前为止,这是我的代码:

导入 csv

file = open('test_csv.csv', 'r')
rows = []
for line in file:
  fields = []  
  mycsv = csv.reader([line], dialect='excel', \
    quotechar='"', quoting=csv.QUOTE_MINIMAL)
  for field in mycsv:
    fields.append(field)
  rows.append(fields)

谢谢你。

4

1 回答 1

12

与其自己拆分行,不如让我们csv.reader这样做:

>>> from StringIO import StringIO
>>> import csv
>>> file = StringIO("""a,"b",c,d,"e
e
e",f
a,bb,c,d,ee ,"f
f"
a,b,"c
c",d,e,f""")
>>> for line in csv.reader(file):
    print line

['a', 'b', 'c', 'd', 'e\ne\ne', 'f']
['a', 'bb', 'c', 'd', 'ee ', 'f\nf']
['a', 'b', 'c\nc', 'd', 'e', 'f']

进一步解释:通过自己循环这些行,并为每一行创建一个读取,您在逻辑上将文件视为每行是一个单独且完整的 csv 文件。相反,您希望将整个文件视为 csv 文档。您可以通过将文件对象传递给 来做到这一点csv.reader,因为迭代文件对象会迭代文件的行,或者自己读取文件,用换行符分割行,然后将所有分割行的列表传递到 csv.reader

于 2013-09-10T17:06:29.913 回答