为什么在使用Python中的Dictwriter输出时,CSV文件在每个数据行之间包含一个空行

myn*_*ame 89 python csv dictionary

我正在使用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)
Run Code Online (Sandbox Code Playgroud)

Fat*_*man 123

默认情况下,csv模块中的类使用Windows样式的行终止符(\r\n)而不是Unix样式(\n).这可能是导致明显的双重换行的原因吗?

如果是这样,您可以在DictWriter构造函数中覆盖它:

output = csv.DictWriter(open('file3.csv','w'), delimiter=',', lineterminator='\n', fieldnames=headers)
Run Code Online (Sandbox Code Playgroud)

  • 或者你可以像这样打开输出csv:open(filename,"wb").它为我修好了. (37认同)
  • [阅读**python 3**的文档](https://docs.python.org/3.5/library/csv.html):*如果csvfile是文件对象,则应使用newline =''*打开它.这意味着,使用python 3,你应该总是打开这样写:`open('some.csv','w',newline ='')`[(source)](https://docs.python.org/ 3.5 /库/ csv.html#ID3) (19认同)
  • 不确定它是Python 3还是其他原因,但是当我使用"wb"时,它会写一个空白文件,而lineterminator ='\n'选项可以正常工作.作为旁注,考虑到它是一个文本文件,你想要以二进制模式编写CSV文件似乎是违反直觉的.也许这只与阅读有关,而不是写作. (5认同)
  • Windows 3上的Python 3中的问题似乎是文件对象为每一行写了"\ r \n",但csv编写器似乎写了一个额外的`\ r``.在十六进制编辑器中,您将看到`0D 0D 0A`,这将使文本编辑器识别Macintosh换行符样式,从而为`\ r \n\r`显示两个换行符并忽略`\n`.将`newline ='\n'`提供给`open()`为我解决了它(写'\ r \n`,这对Excel方言是正确的). (5认同)

ber*_*nie 31

来自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)
Run Code Online (Sandbox Code Playgroud)


Jam*_*son 10

更改此行中的"w"(写入):

output = csv.DictWriter(open('file3.csv','w'), delimiter=',', fieldnames=headers)
Run Code Online (Sandbox Code Playgroud)

'wb'(写二进制文件)为我解决了这个问题:

output = csv.DictWriter(open('file3.csv','wb'), delimiter=',', fieldnames=headers)
Run Code Online (Sandbox Code Playgroud)

Python v2.75:Open()

感谢@dandrejvv对上述原帖中的评论中的解决方案.