import csv
with open('thefile.csv', 'rb') as f:
data = list(csv.reader(f))
import collections
counter = collections.defaultdict(int)
for row in data:
counter[row[10]] += 1
with open('/pythonwork/thefile_subset11.csv', 'w') as outfile:
writer = csv.writer(outfile)
for row in data:
if counter[row[10]] >= 504:
writer.writerow(row)
Dieser Code liest thefile.csv
, nimmt Änderungen vor und schreibt Ergebnisse in thefile_subset1
.
Wenn ich jedoch die resultierende CSV in Microsoft Excel öffne, wird nach jedem Datensatz eine zusätzliche Leerzeile angezeigt!
Gibt es eine Möglichkeit, keine zusätzliche Leerzeile einzufügen?
Antworten:
Öffnen Sie in Python 2 den
outfile
Modus'wb'
anstelle von'w'
. Dascsv.writer
schreibt\r\n
direkt in die Datei. Wenn Sie die Datei nicht in öffnen binären Modus, wird es schreiben ,\r\r\n
weil auf Windows Text - Modus wird jedes übersetzen\n
in\r\n
.In Python 3 wurde die erforderliche Syntax geändert (siehe Dokumentationslinks unten). Öffnen Sie sie stattdessen
outfile
mit dem zusätzlichen Parameternewline=''
(leere Zeichenfolge).Beispiele:
Dokumentationslinks
quelle
io.open
dasnewlines
Argument verwenden. Wenn Sie immer noch in 2.x schreiben, scheint dies ohnehin eine bessere Wahl zu sein, da es vorwärtskompatibel ist.io.open
. Es gibt einunicodecsv
Drittanbieter-Modul für Python 2.7, das besser funktioniert.newline=''
Trick in Python3 mit StringIO oder TemporaryFile nicht funktioniert?StringIO
puffert die gleichen Codepunkte, die in eine Datei codiert würden, undTemporaryFile
unterstützt dennewline
Parameter, sodass er wie bei geöffnet werden kannopen
. Stellen Sie eine Frage mit einem Beispielprogramm, das nicht funktioniert.Das Öffnen der Datei im Binärmodus "wb" funktioniert in Python 3+ nicht. Oder besser gesagt, Sie müssten Ihre Daten vor dem Schreiben in Binärdaten konvertieren. Das ist nur ein Ärger.
Stattdessen sollten Sie den Textmodus beibehalten, die neue Zeile jedoch als leer überschreiben. Wie so:
quelle
Die einfache Antwort ist, dass CSV-Dateien immer im Binärmodus geöffnet werden sollten, egal ob für die Eingabe oder Ausgabe, da sonst unter Windows Probleme mit dem Zeilenende auftreten. Speziell bei der Ausgabe wird das CSV - Modul schreiben
\r\n
(den Standardzeilenabschluss CSV) und dann (im Textmodus) die Laufzeit ersetzt die\n
durch\r\n
(die Windows - Standard Line Terminator) gibt ein Ergebnis\r\r\n
.Mit dem herumzuspielen
lineterminator
ist NICHT die Lösung.quelle
Hinweis: Dies scheint nicht die bevorzugte Lösung zu sein, da die zusätzliche Zeile auf einem Windows-System hinzugefügt wurde. Wie im Python-Dokument angegeben :
Windows ist eine solche Plattform, auf der dies einen Unterschied macht. Während das Ändern des Zeilenabschlusses, wie unten beschrieben, das Problem möglicherweise behoben hat, kann das Problem insgesamt vermieden werden, indem die Datei im Binärmodus geöffnet wird. Man könnte sagen, diese Lösung ist "eleganter". Das "Fummeln" mit dem Zeilenabschluss hätte in diesem Fall wahrscheinlich zu nicht portierbarem Code zwischen Systemen geführt, wobei das Öffnen einer Datei im Binärmodus auf einem Unix-System keine Auswirkungen hat. dh. Dies führt zu systemübergreifendem Code.
Aus Python-Dokumenten :
Original :
Als Teil der optionalen Parameter für den csv.writer müssen Sie möglicherweise den Liniensterminator ändern, wenn Sie zusätzliche Leerzeilen erhalten (Informationen hier ). Beispiel unten aus der Python-Seite CSV-Dokumente angepasst . Ändern Sie es von '\ n' in das, was es sein sollte. Da dies nur ein Stich in die Dunkelheit bei dem Problem ist, kann dies funktionieren oder auch nicht, aber es ist meine beste Vermutung.
quelle
Ich schreibe diese Antwort für Python 3, da ich anfangs das gleiche Problem habe.
Ich sollte Daten von Arduino mit bekommen
PySerial
und sie in eine CSV-Datei schreiben. Jede Lesung in meinem Fall endete mit'\r\n'
, sodass die neue Zeile immer jede Zeile trennte.In meinem Fall hat die
newline=''
Option nicht funktioniert. Weil es einige Fehler zeigte wie:Es schien also, dass sie hier das Auslassen von Zeilenumbrüchen nicht akzeptieren.
Als ich hier nur eine der Antworten sah, erwähnte ich den Zeilenabschluss im Writer-Objekt, wie z.
writer = csv.writer(csv_file, delimiter=' ',lineterminator='\r')
und das hat bei mir funktioniert, weil ich die zusätzlichen Zeilenumbrüche übersprungen habe.
quelle
with open('my_file.csv', 'a',newline='') as csvfile:
funktioniert absolut gut. Das Problem mit Ihrer Antwort ist, dass Sie hier schreiben' '
anstatt''
Der "lineterminator = '\ r'" erlaubt die Übergabe an die nächste Zeile ohne leere Zeile zwischen zwei.
quelle
Ausgehend von dieser Antwort scheint es die sauberste Lösung zu sein, sie zu verwenden
io.TextIOWrapper
. Ich habe es geschafft, dieses Problem wie folgt für mich zu lösen:Die obige Antwort ist nicht mit Python 2 kompatibel. Um Kompatibilität zu haben, müsste man wohl einfach die gesamte Schreiblogik in einen
if
Block packen:quelle
Verwenden Sie die unten definierte Methode, um Daten in die CSV-Datei zu schreiben.
Fügen Sie einfach einen zusätzlichen
newline=''
Parameter in dieopen
Methode ein:Dadurch werden CSV-Zeilen geschrieben, ohne dass zusätzliche Zeilen erstellt werden!
quelle
Bei Verwendung von Python 3 können Leerzeilen mithilfe des Codecs- Moduls vermieden werden. Wie in der Dokumentation angegeben, werden Dateien im Binärmodus geöffnet, sodass keine Änderung des Zeilenumbruchs erforderlich ist. Ich bin kürzlich auf dasselbe Problem gestoßen, und das hat bei mir funktioniert:
quelle