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')