为什么使用Python的Dictwriter输出CSV文件时每行数据之间会有空行?
我正在使用DictWriter把字典里的数据输出到一个csv文件中。可是,为什么生成的CSV文件在每一行数据之间会有一个空行呢?这虽然不是大问题,但我的数据集很大,放不进一个csv文件,因为这种“多余的空行”让文件的行数翻倍了。
我用来写入字典的代码是:
headers=['id', 'year', 'activity', 'lineitem', 'datum']
output = csv.DictWriter(open('file3.csv','w'), delimiter=',', fieldnames=headers)
output.writerow(dict((fn,fn) for fn in headers))
for row in rows:
output.writerow(row)
4 个回答
10
把这一行中的 'w'(写入)改成 'wb'(写入二进制)解决了我的问题:
output = csv.DictWriter(open('file3.csv','w'), delimiter=',', fieldnames=headers)
这样做后就没问题了:
output = csv.DictWriter(open('file3.csv','wb'), delimiter=',', fieldnames=headers)
感谢 @dandrejvv 在上面原帖评论中提供的解决方案。
31
来自csv写入器的文档:
如果csvfile是一个文件对象,它应该用
newline=''
来打开。
换句话说,当你打开这个文件时,需要把newline=''
作为一个参数传进去。
你还可以使用with
语句,这样在写完文件后,它会自动帮你关闭文件。
下面是一个经过测试的例子:
from __future__ import with_statement # not necessary in newer versions
import csv
headers=['id', 'year', 'activity', 'lineitem', 'datum']
with open('file3.csv','w', newline='') as fou:
output = csv.DictWriter(fou,delimiter=',',fieldnames=headers)
output.writerow(dict((fn,fn) for fn in headers))
output.writerows(rows)
133
默认情况下,csv
模块中的类使用的是Windows风格的换行符(\r\n
),而不是Unix风格的(\n
)。这可能就是导致你看到的双重换行的原因吗?
如果真是这样,在Python 2中,你可以在DictWriter
的构造函数中进行覆盖:
output = csv.DictWriter(open('file3.csv','w'), delimiter=',', lineterminator='\n', fieldnames=headers)