2009-07-23 4 views
36

Nach dem its documentation sollte csv.writer standardmäßig '\ r \ n' als Lineterminator verwenden.Python 2 CSV Writer produziert falsche Leitungsabschluss unter 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") 

Dieser druckt

\r\n 
\r\n 

wie erwartet. Aber die csv-Datei verwendet das lineterminator '\ r \ r \ n'

0,1,2,3,4 

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

a,b,c,d,e 

A,B,C,D,E 

Ist das ein Bug oder ist es etwas falsch in meinem Gebrauch von csv.writer?

Python-Version:

Active 2.6.2.2 (Active Software Inc.), basierend auf Python 2.6.2 (R262: 71600, 21. April 2009, 15.05.37) [MSC v 0,1500 32 Bit (Intel)] auf win32

auf Windows Vista

+0

Ich kann Ihr Problem nicht reproduzieren: $ Datei test.csv test.csv: ASCII-Text, mit CRLF Zeilenabschluss –

+1

@lutz: $ prompt bedeutet * x was bedeutet keinen Unterschied (in Python 2.x) zwischen Text Modus und Binärmodus; OP läuft Windows. –

+2

@wierob: verliere die .replace (...). Replace (...), benutze die eingebaute repr() –

Antwort

60

in Python 2.x öffnen immer die Dateien in binären Modus, wie dokumentiert . csv schreibt \r\n wie erwartet, aber dann werden die zugrunde liegenden Windows-Textdatei Mechanismus Kürzungen und Änderungen, die \n-\r\n ... Gesamtwirkung: \r\r\n

Von der csv.writer Dokumentation:

Wenn csvfile ist ein Dateiobjekt, muss es mit dem Flag 'b' auf Plattformen geöffnet werden, wo das einen Unterschied macht.

Es scheint tatsächlich einige Zurückhaltung zu sein, um den Namen der Hauptschuldige :-)

+0

Scheint zu funktionieren. Kannst du mir sagen, wo das dokumentiert ist? – wierob

+6

Ein nettes "Feature" ist, dass man immer noch im binären Modus auf Plattformen öffnen kann, wo es keine Rolle spielt - zB Linux, also benutze immer den binären Modus. – Arafangion

+2

Ab 3.6, sagen die Docs jetzt 'Wenn csvfile ist ein Dateiobjekt, sollte es mit newline geöffnet werden = ''' – jebob

15

Leider Aussprechen, ist es ein bisschen anders mit dem CSV-Modul für Python 3, aber dieser Code auf beiden Python funktioniert 3 2 und Python:

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

Ich glaube, das ist ist Dies ist die einzige Lösung, die sowohl auf Python 2 als auch auf Windows 3 und Linux funktioniert und Dateien generiert, die unabhängig von der Plattform dem CSV-Standard '\ r \ n' entsprechen. – MestreLion

19

Um den Zeilenabschluss in Python 2.7 csv writer Verwendung

zu ändern

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

Dies ist eine viel einfachere Möglichkeit, das Standardtrennzeichen von \ r \ n zu ändern.

+0

Das funktioniert bei mir auch in 3.4 – Terrabits

+0

Es funktioniert und ist einfach !! Ich benutze DictWriter zu stdout --- also sind die obigen Lösungen nicht wirklich angemessen oder fügen zusätzlichen Overhead hinzu. – ripvlan

+0

Related: https://StackOverflow.com/a/39379062/95852 –