【问题标题】:How can I stop Python's csv.DictWriter.writerows from adding empty lines between rows in Windows when using stdout?使用标准输出时,如何阻止 Python 的 csv.DictWriter.writerows 在 Windows 中的行之间添加空行?
【发布时间】:2015-03-15 05:15:52
【问题描述】:

当我在 Eclipse 中使用 PyDev 运行此代码时,我看到输出在行之间带有空行。我怎样才能摆脱它们?它仅使用 python3 发生。

import csv
import sys

fieldnames = ['first_name', 'last_name']
writer = csv.DictWriter(sys.stdout, fieldnames=fieldnames)

writer.writeheader()
writer.writerow({'first_name': 'Baked', 'last_name': 'Beans'})
writer.writerow({'first_name': 'Lovely', 'last_name': 'Spam'})
writer.writerow({'first_name': 'Wonderful', 'last_name': 'Spam'})

Eclipse 中的输出

名字,姓氏

焗豆

可爱,垃圾邮件

太棒了,垃圾邮件

在 cygwin-bash 中输出是正确的,在 Linux 上,在 cmd.exe + Windows python 中使用重定向到文件时不正确(控制台窗口显然是正确的)

【问题讨论】:

  • 你在截图中使用了哪个应用?

标签: python eclipse csv python-3.x pydev


【解决方案1】:

文档非常清楚 CSV 模块需要控制换行符;在 Python 2 中,您应该以二进制模式打开文件对象,在 Python 3 中,您需要将 newline 选项设置为 ''。见How can I stop Python's csv.DictWriter.writerows from adding empty lines between rows in Windows?

这是因为模块默认将\r\n 行分隔符写入文件。然后,Windows 文本模式处理将 \n 替换为 \r\n,您会看到出现空行,因为现在行由 \r\r\n 分隔。

您可以将lineterminator argument 设置为'\n' 以更改模块用于分隔行的内容:

writer = csv.DictWriter(sys.stdout, fieldnames=fieldnames, 
                        lineterminator='\n')

演示:

>>> import csv
>>> from StringIO import StringIO
>>> fieldnames = ['first_name', 'last_name']
>>> out = StringIO()
>>> writer = csv.DictWriter(out, fieldnames=fieldnames)
>>> writer.writeheader()
>>> out.getvalue()
'first_name,last_name\r\n'
>>> out = StringIO()
>>> writer = csv.DictWriter(out, fieldnames=fieldnames, lineterminator='\n')
>>> writer.writeheader()
>>> out.getvalue()
'first_name,last_name\n'

sys.stdout 仍会将 \n 转换为 \r\n,但现在它前面没有 \r

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-03
    • 2018-08-21
    • 1970-01-01
    相关资源
    最近更新 更多