2009-07-23 71 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中的默認分隔符的方式。