CSV in Python, ein zusätzliches carriage-return, auf Windows
In Python 2.7 läuft unter Windows XP pro:
import csv
outfile = file('test.csv', 'w')
writer = csv.writer(outfile, delimiter=',', quoting=csv.QUOTE_MINIMAL)
writer.writerow(['hi','dude'])
writer.writerow(['hi2','dude2'])
outfile.close()
Erzeugt es eine Datei, test.csv, mit einer extra - \ - r in jeder Zeile, etwa so:
test.csv -
hi,dude\r\r\nhi2,dude2\r\r\n
statt des erwarteten:
hi,dude\r\nhi2,dude2\r\n
Warum ist das passiert, oder ist das eigentlich das gewünschte Verhalten?
- Möglich, Duplikat der Python 2 CSV-writer produziert falsche Zeilenende-Zeichen unter Windows
Du musst angemeldet sein, um einen Kommentar abzugeben.
Auf Windows, öffnen Sie immer Ihre Dateien im Binär-Modus ("rb" bzw. "wb"), bevor Sie Sie in csv.reader-oder csv-Format.Schriftsteller.
Obwohl die Datei eine text-Datei, CSV-gilt ein binäre format der Bibliotheken beteiligt, mit "\r\n" Trennung von Datensätzen. Wenn das Trennzeichen ist geschrieben im text-Modus, der Python-runtime ersetzt "\n" mit "\r\n", daher das "\r\n\r", dass Sie beobachtet in Ihrer Datei.
Sehen diese Vorherige Antwort.
Dieser Antwort wurde veröffentlicht in 2010 und befasst sich nicht mit dem problem in Python ist3.
Einer der möglichen Korrekturen in Python ist3, wie beschrieben in @YiboYang Antwort, ist das öffnen der Datei mit der
newline
- parameter auf einen leeren string:open(..., "w", newline="\n", encoding="utf-8")
.newline
können auch eine leere Zeichenfolge, gleiche Ergebnis."wb"
funktioniert nicht in Python 3, Streicher und die Puffer-Schnittstelle nicht kompatibel sind.writer = csv.writer(f, lineterminator='\n')
Während @john-machin gibt eine gute Antwort, es ist nicht immer der beste Ansatz. Zum Beispiel, es funktioniert nicht auf Python 3, es sei denn, Sie Kodieren alle Ihre Eingaben, um die CSV-writer. Auch ist es nicht das Problem wenn das script verwenden will, sys.stdout als stream.
Schlage ich vor, stattdessen die Einstellung des lineterminator " - Attribut bei der Erstellung der Schriftsteller:
Diesem Beispiel wird auf Python 2 und Python 3 und nicht produzieren die unerwünschten Zeilenumbruch-Zeichen. Beachten Sie jedoch, dass es möglicherweise unerwünschte Zeilenumbrüche (wobei das Zeichen LF auf Unix-Betriebssystemen).
In den meisten Fällen jedoch glaube ich, dass Verhalten ist besser und natürlicher, als die Behandlung aller CSV als ein binäres format. Ich Stelle diese Antwort als eine alternative für Ihre Aufmerksamkeit.
\r
ist nicht mehr entkommen! Sieht nach bug incsvwriter
, aber so wie es da steht, die Ausgabe von nicht-konformen CSV bedeutet dies ist nicht der Weg zu gehen.In Python 3 (ich habe nicht versucht, diese in Python-2), können Sie auch einfach
als pro Dokumentation.
Mehr dazu in den doc ' s Fußnote:
3.7.2
auf MacOS.Ich bin mir nicht ganz sicher, warum es geschieht, aber ändern Sie Ihre Datei-Modus von "w" zu "wb" behoben werden. Siehe meine Antwort zu "wie entfernen ^M" für mehr details.
Müssen Sie fügen Sie das Attribut newline="\n" zu öffnen-Funktion wie diese:
Können Sie sich vorstellen, die lineterminator='\n' parameter in der csv-writer-Befehl.
lineterminator='\n'
); das CSV-Modul zu sein schien, die Herkunft des\r\n
. Keine Argumente zuopen
hatte keine Wirkung.Beachten Sie, dass wenn Sie DictWriter, haben Sie eine neue Linie von der Funktion öffnen und eine neue Zeile aus der writerow Funktion.
Sie können newline=" in die open-Funktion zu entfernen die zusätzlichen Zeilenumbruch.