2012-01-05 78 views
71

我正在使用DictWriter将字典中的数据输出到csv文件。为什么CSV文件在每个数据行之间有空行?这不是什么大问题,但是我的数据集很大,并且不适合放入一个csv文件,因为它的行数太多,因为“双倍行距”会使文件中的行数加倍。为什么CSV文件在Python中使用Dictwriter输出时在每个数据行之间包含空行

我写的字典代码:

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) 

回答

89

默认情况下,在csv模块使用Windows风格的行结束符类(\r\n),而不是Unix的(\n)。这可能是什么导致明显的双重换行符?

如果是这样,你可以在DictWriter构造覆盖它:

output = csv.DictWriter(open('file3.csv','w'), delimiter=',', lineterminator='\n', fieldnames=headers) 
+36

或者你可以像这样打开输出csv:open(filename,“wb”)。它为我解决了这个问题。 – 2013-08-05 06:47:15

+4

不知道它是Python 3还是其他原因,但是当我使用“wb”它写入一个空白文件,而lineterminator ='\ n'选项完美。作为一个附注,与二进制模式下编写CSV文件相比,这看起来是违反直觉的,因为它是一个文本文件。也许这只与阅读有关,而不是写作。 – Davos 2014-05-02 03:35:00

+1

在Python 3,如果你使用的WB“你需要,以便它知道如何将Unicode文本转换成字节 http://www.pythoncentral.io/encoding-and-decoding-到指定的字符串编码串式的Python-3-X/ 据我所知,如果你只使用“W”和你写它会用ASCII编码,和失败,如果您有任何的unicode字符在那里的字符串。 – drojf 2015-05-15 04:14:41

0

我只是测试你的片断,他们是没有双间距线在这里。最终的线是\r\n,所以,我会检查你的情况是:

  1. 你的编辑器读取正确的DOS文件
  2. 没有\ n的值是否存在你行快译通。

(请注意,即使通过将与\ n的值,DictWriter全自动报值)。

29

http://docs.python.org/library/csv.html#csv.writer

如果csvfile是一个文件对象,它必须在 'B' 标志被打开 平台在哪里有所作为。

换句话说,打开文件时,你传递'wb'而不是'w'。
您也可以在写完文件后使用with语句关闭文件。
测试示例如下:

from __future__ import with_statement # not necessary in newer versions 
import csv 
headers=['id', 'year', 'activity', 'lineitem', 'datum'] 
with open('file3.csv','wb') as fou: # note: 'wb' instead of 'w' 
    output = csv.DictWriter(fou,delimiter=',',fieldnames=headers) 
    output.writerow(dict((fn,fn) for fn in headers)) 
    output.writerows(rows) 
+1

谢谢!我只是将打开的标志从'w'更改为'wb',并且它可以工作,而无需添加任何lineterminator。 F =开放(FILE_PATH, 'WB') file_writer = csv.writer(F,quotechar = ''“,引用= csv.QUOTE_MINIMAL) – 2017-08-23 14:43:02

10

在此行更改 'W'(写):

output = csv.DictWriter(open('file3.csv','w'), delimiter=',', fieldnames=headers) 

为了把wb(写二进制)固定这个问题对我来说:

output = csv.DictWriter(open('file3.csv','wb'), delimiter=',', fieldnames=headers) 

Python v2.75: Open()

感谢@dandrejvv为解决方案在上面的原始帖子的评论。

+0

当使用 'WB' 我发现我不能在Python脚本后来追加否则最终的CSV将只包含最后一行。我必须打开输出文件'a' – armani 2014-11-17 21:55:28

相关问题