Python 2 CSV编写器在Windows上生成错误的行终止符
问题内容:
根据其文档,
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文件使用换行符’\ 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版本:
在Win32上基于Python 2.6.2的ActivePython 2.6.2.2(ActiveState Software
Inc.)(r262:71600,2009年4月21日,15:05:37)[MSC v.1500 32位(Intel)]
在Windows Vista上
问题答案:
在Python 2.x中,请务必按照 二进制 方式以 二进制
模式打开文件。按照您的预期进行csv
编写\r\n
,但是随后的基础Windows文本文件机制切入并将其更改\n
为\r\n
…总效果:\r\r\n
从csv.writer
文档中:
如果 csvfile 是文件对象,则必须在
'b'
有区别的平台上使用标志打开它。
实际上说出主要罪魁祸首的名字似乎有些沉默寡言:-)
编辑:正如@jebob在此答案的注释中提到的,并基于@Dave
Burton的答案,要在Python
2和3中处理这种情况,您应该执行以下操作:
if sys.version_info >= (3,0,0):
f = open(filename, 'w', newline='')
else:
f = open(filename, 'wb')