2009-07-23 29 views
36

产生错误的行终止按照its documentation csv.writer应该使用 '\ r \ n' 作为默认lineterminator。的Python 2 CSV作家在Windows

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文件使用lineterminator“\ 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的基于Python的2.6.2 (r262:71600,2009年4月21日,15时05分37秒)2.6.2.2(ActiveState的 软件公司) [MSC v 0.1500 32位(英特尔)]在Win32

在Windows Vista上

+0

我无法重现你的问题:$文件test.csv test.csv:ASCII文本,以CRLF行终止 – 2009-07-23 07:37:04

+1

@lutz:$提示符手段* X也就是说,文本没有区别(在Python 2.x的)模式和二进制模式; OP正在运行Windows。 – 2009-07-23 07:56:15

+2

@wierob:失去.replace(...)代替(...),可以使用内置的再版() – 2009-07-23 08:00:07

回答

60

在Python 2.x中,始终处于二进制模式下打开的文件,如记录。 csv写道:\r\n如你预期,但随后基本的Windows文本文件的机制削减和变化是\n\r\n ...总的效果:\r\r\n

csv.writer文档:

如果csvfile是一个文件对象,它必须与平台'b'标志,在有差别打开。

似乎有大约:-)

15

遗憾的是居然说出了罪魁祸首的名字有些沉默,它与为Python 3 csv模块有点不同,但是这个代码将在两个工作的Python 2和Python 3:

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

要改变在Python 2.7 CSV作家使用线路终端器

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

这是一个简单得多的改变从\ r \ n中的默认分隔符的方式。