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

wie*_*rob 43 python windows csv line-endings python-2.x

根据其文档,csv.writer默认情况下应使用'\ r \n'作为lineterminator.

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")
Run Code Online (Sandbox Code Playgroud)

这打印

\r\n
\r\n
Run Code Online (Sandbox Code Playgroud)

正如所料.但是,创建的csv文件使用了行终止符'\ r \n\r \n'

0,1,2,3,4

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

a,b,c,d,e

A,B,C,D,E
Run Code Online (Sandbox Code Playgroud)

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

Python版本:

在Win32上基于Python 2.6.2(r262:71600,2009年4月21日,15:05:37)[MSC v.1500 32位(英特尔)]的ActivePython 2.6.2.2(ActiveState Software Inc.)

在Windows Vista上

Joh*_*hin 65

在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')
Run Code Online (Sandbox Code Playgroud)

  • 一个不错的"功能"是,仍然可以在无关紧要的平台上以二进制模式打开 - 例如,Linux,因此始终使用二进制模式. (6认同)
  • 从3.6开始,文档现在说`如果csvfile是一个文件对象,它应该用newline =''打开 (3认同)

Dav*_*ton 25

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

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

  • 我相信这是唯一适用于Windows 2和Linux的Python 2和3的解决方案,并生成符合"/ r \n"的CSV标准的文件,无论平台如何. (3认同)

Jas*_*han 22

要在Python 2.7 csv writer中使用更改行终止符

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

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

  • 虽然这适用于 Windows 上的 python 2 和 3,但它会在 Linux 机器上创建非标准文件:根据规范,CSV 文件 _should_ 以 `\r\n` 结束行,而不考虑平台,而不是 `\n`。 (2认同)