python - 在Python中使用Dictwriter输出时,为啥CSV文件在每个数据行之间包含一个空白行[重复]

Posted

技术标签:

【中文标题】python - 在Python中使用Dictwriter输出时,为啥CSV文件在每个数据行之间包含一个空白行[重复]【英文标题】:Why does CSV file contain a blank line in between each data line when outputting with Dictwriter in Python [duplicate]python - 在Python中使用Dictwriter输出时,为什么CSV文件在每个数据行之间包含一个空白行[重复] 【发布时间】:2012-02-03 12:53:59 【问题描述】:

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

【问题讨论】:

【参考方案1】:

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

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

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

【讨论】:

或者您可以像这样打开输出 csv:open(filename, "wb").它为我解决了这个问题。 不确定是 Python 3 还是其他原因,但是当我使用“wb”时,它会写入一个空白文件,而 lineterminator = '\n' 选项工作得很好。附带说明一下,考虑到它是文本文件,您想要以二进制模式编写 CSV 文件似乎违反直觉。也许这仅与阅读有关,与写作无关。 在python 3中,如果你使用'wb',你需要指定你的字符串的编码,以便它知道如何将你的unicode文本转换为字节pythoncentral.io/encoding-and-decoding-strings-in-python-3-xafaik,如果你只使用'w'然后你写一个字符串,它将使用 ascii 编码,如果你有任何 unicode 字符则失败。 Windows 上 Python 3 中的问题似乎是文件对象为每一行写入 \r\n,但 csv 编写器似乎额外编写了一个 \r。在十六进制编辑器中,您将看到0D 0D 0A,这将使文本编辑器识别Macintosh 换行样式,从而为\r\r 显示两个换行符并忽略\n。将newline='\n' 提供给open() 为我解决了这个问题(写\r\n,这对于Excel 方言是正确的)。 Read the docs for python 3: 如果 csvfile 是一个文件对象,它应该用 newline='' 打开。这意味着,使用 python 3 你应该总是这样写:open('some.csv', 'w', newline='')(source)【参考方案2】:

来自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)

【讨论】:

谢谢!我只是将 open 标志从“w”更改为“wb”,它可以工作,而无需添加任何换行符。 f = open(file_path, 'wb') file_writer = csv.writer(f, quotechar='"', quoting=csv.QUOTE_MINIMAL)【参考方案3】:

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

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

To 'wb' (write binary) 为我解决了这个问题:

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

Python v2.75: Open()

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

【讨论】:

当使用 'wb' 时,我发现以后无法在 Python 脚本中追加,否则最终的 CSV 将只包含写入的最后一行。我必须用'a'打开输出文件【参考方案4】:

我刚刚测试了你的sn-p,这里没有双倍行距。行尾是\r\n,所以我要检查你的情况是:

    您的编辑器正在正确读取 DOS 文件 在您的 rows dict 的值中不存在 \n。

(请注意,即使使用 \n 输入值,DictWriter 也会自动引用该值。)

【讨论】:

以上是关于python - 在Python中使用Dictwriter输出时,为啥CSV文件在每个数据行之间包含一个空白行[重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Python 3.x 和 Python 2.x 中使用 pip

在 python 中使用没有 python2 和 python1 的 python3 或同时打印? [关闭]

使用命令行参数在另一个 Python 脚本中调用一个 Python 脚本

python 在python中使用全局变量

多版本 Python 在使用中的灵活切换

如何使用 Boost.Python 在 Python 中调用内置函数