2012-03-23 5 views
19

Ich merke, dass die csv Bibliothek in Python immer DOS End-of-Line-Zeichen erzeugt. Auch wenn ich den 'wb' Modus benutze, auch wenn ich Linux benutze.Verwendet Python CSV-Brenner immer DOS-Zeilenende-Zeichen?

import csv 

f = open('output.txt', 'wb'); 
writer = csv.writer(f) 
writer.writerow([2,3,4]); 
f.close() 

Der obige Code verwendet immer '\r\n' als Zeilenendetrennzeichen. Wie kann ich es verwenden nur verwenden '\n'?

+3

Die CSV-MIME-Spezifikation Mandate CRLF als Zeilentrennzeichen: https://tools.ietf.org/html/rfc4180 –

+0

ich die csv * Leser glauben * immer tut und kann nicht geändert werden, aber du bist nur zu fragen über den * writer *, dessen Standard geändert werden kann. – smci

Antwort

42

Sie können give your writer Instanz ein benutzerdefinierten lineterminator Argument im Konstruktor:

writer = csv.writer(f, lineterminator="\n") 
+0

kann Lineterminator als Kombination von zwei Zeichen gegeben werden? – user1479571

+0

@ user1479571 Haben Sie es versucht? –

19

Als Niklas answered, die lineterminator argument können Sie Ihre Zeilenende wählen. Anstatt es auf \n hart zu codieren, machen Sie es plattformunabhängig, indem Sie line separator Ihrer Plattform verwenden: os.linesep.

import csv 
import os 

f = open('output.csv', 'wb') 
writer = csv.writer(f, lineterminator=os.linesep) 
writer.writerow([2,3,4]) 
f.close() 

Für andere, die diesen Beitrag finden, setzen Sie das 'wb' nicht entgehen lassen. Sie werden kein Problem bemerken, wenn Sie es auf einigen Plattformen wie GNU/Linux vermissen, aber es ist wichtig, die Datei in binary mode auf Plattformen zu öffnen, wo das wichtig ist, wie Windows. Andernfalls kann die CSV-Datei mit Zeilenenden wie \r\r\n enden. Wenn Sie 'wb' und os.linesep verwenden, sollten Ihre Zeilenenden auf allen Plattformen korrekt sein.

+0

also, auch wenn Sie den Schreiber "* plattformunabhängig *" machen, ist Ihr Skript immer noch plattformabhängig, weil Sie es in Binärform öffnen müssen, aber nur wo nötig? Wenn ich 'wb' auf Linux versuche, erhalte ich einen Fehler für' writer.writeheader() ' –

+1

Ich habe es gerade auf Ubuntu 16.04 mit' writer' und 'DictWriter' mit' wb', @CiprianTomoiaga versucht, und es funktioniert gut für mich. Ich schlage vor, dass Sie eine neue Frage mit einem Codebeispiel und der Fehlermeldung posten, und fügen Sie dann einen Kommentar mit einem Link zu Ihrer Frage hinzu. –

+1

@CiprianTomoiaga Dies funktioniert nicht mit Python 3. Das CSV-Modul geht davon aus, dass es normale Strings schreiben kann und dies ist nicht mehr der Fall, wenn Sie die Datei mit ''wb'' öffnen (Sie würden einen' TypError' erhalten) . Daher müssen Sie die Datei wie folgt öffnen: 'f = open ('output.csv', 'w', newline = '')' wenn Sie Python 3 verwenden. Siehe auch [Python 3 CSV-Dokumentation] (https: //docs.python.org/3.5/library/csv.html#csv.writer). – maxschlepzig

Verwandte Themen