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 上产生错误的行终止符的主要内容,如果未能解决你的问题,请参考以下文章