我觉得这是一个常见的问题,我在字段中有一个带换行符的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)
谢谢。
答案 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
。