Python 2 CSV 写入器在 Windows 上产生错误的行结束符

46 投票
3 回答
37104 浏览
提问于 2025-04-15 13:06

根据官方文档,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

这是个bug,还是我使用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位(Intel)] 在Windows Vista上

运行在Windows Vista系统上

3 个回答

23

要在Python 2.7的csv写入器中更改行结束符,可以使用

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

这样做比默认的\r\n更简单,可以轻松地把分隔符改成你想要的。

26

不幸的是,Python 3的csv模块有点不同,不过这段代码在Python 2和Python 3上都能运行:

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

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

撰写回答