2009-07-23 29 views
36

üzerinde yanlış satır sonlandırıcısı üretir its documentation csv.writer 'varsayılan olarak lineterminator olarak' \ r \ n 'kullanmalıdır. beklendiği gibiPython 2 CSV yazıcısı, 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") 

Bu

\r\n 
\r\n 

yazdırır. Ama, oluşturulan CSV dosyası lineterminator kullanır '\ r \ r \ n'

0,1,2,3,4 

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

a,b,c,d,e 

A,B,C,D,E 

Bu bir hata mı yoksa csv.writer benim kullanımında sorun var?

Python sürümü:

ActivePython Python 2.6.2 (r262: 71600, 21 Nisan 2009, 15:05:37) dayalı 2.6.2.2 (ActiveState Software Inc.) [MSC v belirtildiği gibi Windows Vista win32'de

üzerinde 0,1500 32 bit (Intel)]

+0

Sorununuzu yeniden oluşturamıyorum: $ file test.csv test.csv: ASCII metni, CRLF satır sonlandırıcılarıyla –

+1

@lutz: $ komut istemi, * x, anlamsızlık anlamına gelir (Python 2.x içinde) metin arasında mod ve ikili mod; OP, Windows kullanıyor. –

+2

@wierob: .replace'ı (...) değiştirin. Değiştirin (...), yerleşik repr() kullanın –

cevap

60

Python 2.x daima ikili modda dosyayı açmak . Eğer beklendiği gibi csv\r\n yazar, ama sonra temel Windows metin dosyası mekanizması keser ve değişikliklerin \n ... toplam etki \r\n o: csv.writer belgelerine \r\r\n

:

Eğer CSVfile olduğunu Bir dosya nesnesi, fark yaratan platformlarda 'b' bayrağı ile açılmalıdır.

aslında maalesef

+0

görünüyor. Bunun nerede belgelendiğini söyler misin? – wierob

+6

Güzel bir "özellik", bir sorun olmadığı platformlarda ikili modda açılabiliyor olmasıdır - örneğin, Linux, bu yüzden her zaman ikili modunu kullanın. – Arafangion

+2

3'ten itibaren.Bunun olduğunu düşünüyoruz tüm Python 2.x – jebob

15

:-) ana suçlu adını söylediği hakkında bazı suskunluk var gibi gözüküyor, bu Python 3 için csv modülü ile biraz farklı, ama bu kod hem Python üzerinde çalışacak 2 ve Python 3:

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

ki: 6, dokümanlar şimdi benim cevap başlangıcı CSVfile bir dosya nesnesi ise, = '' ' – MestreLion

19

Python 2.7 csv yazar kullanımda hat terminatör değiştirmek için

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

Bu, varsayılan sınırlayıcıyı \ r \ n'den değiştirmek için daha basit bir yoldur.

+0

Bu durum – Terrabits

+0

O inşaat ve basittir 3.4'de benim için çalışıyor !! Yukarıdaki çözümler gerçekten uygun değildir bu yüzden --- stdout veya ekstra yükü eklemek için DictWriter kullanıyorum. – ripvlan

+0

İlgili: Bu pencerelerde piton 2 ve 3 için işe yararken https://stackoverflow.com/a/39379062/95852 –