Python中的CSV,引号中带有换行符

art*_*tdv 5 python csv

我得到的印象是这是一个常见的问题,我在字段中有一个带换行符的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
Run Code Online (Sandbox Code Playgroud)

并非所有字段都将用引号括起来(虽然在本例中我的用法是随机的,但实际文件应与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]]
Run Code Online (Sandbox Code Playgroud)

相反,我得到了

[[['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']]]
Run Code Online (Sandbox Code Playgroud)

请关注行数和列数.另一个问题是,在第三行中,如果不应该包含引号.

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

导入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)
Run Code Online (Sandbox Code Playgroud)

谢谢.

Cla*_*diu 6

不要自己拆分线,而是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']
Run Code Online (Sandbox Code Playgroud)

进一步的解释:通过循环遍历这些行,并为每一行创建一个读取,您在逻辑上处理该文件,就像每行是一个单独的完整的csv文件一样.相反,您希望将整个文件视为csv文档.您可以通过传递文件对象来执行此操作csv.reader,因为迭代文件对象会迭代文件的行,或者自己读取文件,按换行分割行,然后将所有拆分行的列表传入一个 csv.reader.

  • 总结:`csv.reader` 解析文件,而不是行。 (4认同)