为什么使用Python的Dictwriter输出CSV文件时每行数据之间会有空行?

95 投票
4 回答
113750 浏览
提问于 2025-04-17 09:37

我正在使用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)

Python v2.75: Open()

感谢 @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)

撰写回答