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
这是个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')