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

时间:2013-09-10 17:02:34

标签: 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

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

谢谢。

1 个答案:

答案 0 :(得分: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']

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