Python 2 CSV 编写器在 Windows 上产生错误的行终止符

Posted

技术标签:

【中文标题】Python 2 CSV 编写器在 Windows 上产生错误的行终止符【英文标题】:Python 2 CSV writer produces wrong line terminator on Windows 【发布时间】:2010-11-13 07:14:59 【问题描述】:

根据its documentation csv.writer 应该默认使用'\r\n' 作为换行符。

import csv

with open("test.csv", "w") as f:
    writer = csv.writer(f)

    rows = [(0,1,2,3,4),
           (-0,-1,-2,-3,-4),
           ("a","b","c","d","e"),
           ("A","B","C","D","E")]           

    print writer.dialect.lineterminator.replace("\r", "\\r").replace("\n", "\\n")
    writer.writerows(rows)
    print writer.dialect.lineterminator.replace("\r", "\\r").replace("\n", "\\n")

打印出来

\r\n
\r\n

正如预期的那样。但是,创建的 csv 文件使用 lineterminator '\r\r\n'

0,1,2,3,4

0,-1,-2,-3,-4

a,b,c,d,e

A,B,C,D,E

这是一个错误还是我在使用 csv.writer 时有什么问题?

Python 版本:

ActivePython 2.6.2.2 (ActiveState Software Inc.) 基于 Python 2.6.2 (r262:71600,2009 年 4 月 21 日,15:05:37) [MSC v.1500 32 bit (Intel)] on win32

在 Windows Vista 上

【问题讨论】:

@wierob:丢掉.replace(...).replace(...),使用内置的repr() 【参考方案1】:

在 Python 2.x 中,始终以 binary 模式打开文件,如文档所述。 csv\r\n 如你所料,但随后底层 Windows 文本文件机制介入并将 \n 更改为 \r\n ... 总效果:\r\r\n

来自csv.writer 文档:

如果 csvfile 是一个文件对象,则必须在不同的平台上使用 'b' 标志打开它。

对于实际说出罪魁祸首的名字似乎有些沉默:-)

编辑:正如@jebob 在 cmets 中提到的,基于@Dave Burton 的answer,要在 Python 2 和 3 中处理这种情况,您应该执行以下操作:

if sys.version_info >= (3,0,0):
    f = open(filename, 'w', newline='')
else:
    f = open(filename, 'wb')

【讨论】:

一个不错的“功能”是在无关紧要的平台上仍然可以以二进制模式打开 - 例如,Linux,因此请始终使用二进制模式。 从 3.6 开始,文档现在说 If csvfile is a file object, it should be opened with newline='' @jebob 问题开始,标签,我的回答开始:都说 Python 2.x 我正在使用f = sys.stdout,即使在 Linux 上使用 Python 2.7,它仍然会产生这些回车符。有解决办法吗? 在 Linux 上,这仍然会在我的 Python 2.7 脚本中产生回车。【参考方案2】:

不幸的是,它与 Python 3 的 csv 模块有点不同,但此代码适用于 Python 2 和 Python 3:

if sys.version_info >= (3,0,0):
    f = open(filename, 'w', newline='')
else:
    f = open(filename, 'wb')

【讨论】:

这对我在 Linux/Mac 上的 Python 2 或 3 上都不起作用。它仍在输出 Windows 样式的换行符。 这就是它应该做的,user5359531。 .csv 文件格式应该由以 Windows 样式的换行符结尾的行(记录)组成:“\r\n”如果它省略了 \r,那将是一个错误。【参考方案3】:

要更改 Python 2.7 csv writer 中的行终止符,请使用

writer = csv.writer(f, delimiter = '|', lineterminator='\n')

这是从 \r\n 更改默认分隔符的一种更简单的方法。

【讨论】:

虽然这适用于 windows 上的 python 2 和 3,但它会在 Linux 机器上创建非标准文件:根据规范 CSV 文件 应该\r\n 结束行,无论平台,而不是\n 好点,但有时需要违反标准才能完成特定任务。

以上是关于Python 2 CSV 编写器在 Windows 上产生错误的行终止符的主要内容,如果未能解决你的问题,请参考以下文章

Python3:编写 csv 文件

在 python 2 或 python 3 中编写 csv 文件的便携方式

如何在Windows中写入csv文件[重复]

在字符串周围用引号编写csv(Python)

将csv文件作为python中的变量读入

编写csv文件 - Python [重复]