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()
Es generiert eine Datei test.csv
mit einem Extra \r
in jeder Zeile, wie folgt:
test.csv
hi,dude\r\r\nhi2,dude2\r\r\n
anstelle der erwarteten:
hi,dude\r\nhi2,dude2\r\n
Warum passiert das oder ist das tatsächlich das gewünschte Verhalten?
Hinweis:
- Dieses Verhalten kann bei Python 2 oder 3 auftreten.
Antworten:
Python 3:
newline=''
newline='\n'
Python 2:
Öffnen Sie Ihre Dateien unter Windows immer im Binärmodus (
"rb"
oder"wb"
), bevor Sie sie ancsv.reader
oder übergebencsv.writer
.Obwohl es sich bei der Datei um eine Textdatei handelt, wird CSV von den beteiligten Bibliotheken als Binärformat mit
\r\n
getrennten Datensätzen angesehen. Wenn dieses Trennzeichen im Textmodus geschrieben ist, ersetzt die Python-Laufzeit das\n
mit\r\n
, daher das\r\r\n
in der Datei beobachtete.Siehe diese vorherige Antwort .
quelle
open(..., "w", newline="\n", encoding="utf-8")
.newline
kann auch eine leere Zeichenfolge sein, gleiches Ergebnis."wb"
funktioniert nicht in Python 3, Zeichenfolgen und die Pufferschnittstelle sind nicht kompatibel.writer = csv.writer(f, lineterminator='\n')
Während @ John-Machin eine gute Antwort gibt, ist es nicht immer der beste Ansatz. Beispielsweise funktioniert es unter Python 3 nur, wenn Sie alle Ihre Eingaben in den CSV-Writer codieren. Außerdem wird das Problem nicht behoben, wenn das Skript sys.stdout als Stream verwenden möchte.
Ich schlage vor, stattdessen das Attribut 'lineterminator' beim Erstellen des Writers festzulegen:
Dieses Beispiel funktioniert mit Python 2 und Python 3 und erzeugt keine unerwünschten Zeilenumbrüche. Beachten Sie jedoch, dass es zu unerwünschten Zeilenumbrüchen kommen kann (das LF-Zeichen unter Unix-Betriebssystemen wird weggelassen).
In den meisten Fällen glaube ich jedoch, dass Verhalten vorzuziehen und natürlicher ist, als alle CSVs als Binärformat zu behandeln. Ich gebe diese Antwort als Alternative für Ihre Überlegung.
quelle
\r
wird nicht mehr entkommen! Sieht so aus, als wäre dies ein Fehlercsvwriter
, aber so wie es aussieht , bedeutet die Ausgabe von nicht konformer CSV, dass dies nicht der richtige Weg ist.^M
Problem für mich, während die 2 Vorschläge der akzeptierten Antwort nicht funktionierten.In Python 3 (ich habe dies in Python 2 nicht versucht) können Sie dies auch einfach tun
gemäß Dokumentation .
Mehr dazu in der Fußnote des Dokuments :
quelle
Sie können den Parameter lineterminator = '\ n' in den Befehl csv writer einfügen .
quelle
lineterminator='\n'
). Das CSV-Modul schien der Ursprung von zu sein\r\n
. Keine Reihe von Argumenten,open
die irgendeine Wirkung hatten.Ich bin mir nicht sicher, warum es genau passiert, aber wenn Sie Ihren Dateimodus von "w" auf "wb" ändern, wird das Problem behoben. Weitere Informationen finden Sie in meiner Antwort auf " Entfernen von ^ M ".
quelle
Sie müssen das Attribut newline = "\ n" hinzufügen, um die Funktion wie folgt zu öffnen:
quelle
Beachten Sie, dass Sie bei Verwendung von DictWriter eine neue Zeile aus der Öffnungsfunktion und eine neue Zeile aus der Writerow-Funktion erhalten. Sie können newline = '' in der Öffnungsfunktion verwenden, um die zusätzliche Newline zu entfernen.
quelle