Unutbu已经解释了这种情况的原因,无论如何,一个快速的解决方法是在将空行传递给DictReader
之前用','
替换它们,然后restval
会处理其余的事情。
CSV_FIELDS = ("field1", "field2", "field3")
with open('test.csv') as f:
lines = (',' if line.isspace() else line for line in f)
for row in csv.DictReader(lines, fieldnames=CSV_FIELDS, restval=""):
print row
{'field2': '2', 'field3': '3', 'field1': '1'}
{'field2': '', 'field3': '', 'field1': ''}
{'field2': '', 'field3': '', 'field1': ''}
{'field2': 'b', 'field3': 'c', 'field1': 'a'}
更新:
如果存在多行空值,上述代码无法处理,这种情况下,您可以像下面这样使用csv.reader
:
RESTVAL = ''
with open('test.csv') as f:
for row in csv.reader(f, quotechar='"'):
if not row:
print dict.fromkeys(CSV_FIELDS, RESTVAL)
else:
print {k: v if v else RESTVAL for k, v in zip(CSV_FIELDS, row)}
如果文件包含:
1,2,"
4"
a,b,c
那么输出结果将是:
{'field2': '2', 'field3': '\n\n\n4', 'field1': '1'}
{'field2': '', 'field3': '', 'field1': ''}
{'field2': '', 'field3': '', 'field1': ''}
{'field2': 'b', 'field3': 'c', 'field1': 'a'}
,,
,那么将打印出"never reached, why?"
。这是你想要的吗? - Bhargav Rao