it-swarm.com.de

Mit Python geschriebene CSV-Dateien enthalten zwischen jeder Zeile Leerzeilen

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, gibt es nach jedem Datensatz eine zusätzliche leere Zeile!

Gibt es eine Möglichkeit, dass keine zusätzliche Leerzeile eingefügt wird?

Öffnen Sie in Python 2 outfile mit dem Modus 'wb' anstelle von 'w'. Der csv.writer schreibt \r\n direkt in die Datei. Wenn Sie die Datei nicht im Modus binary öffnen, wird \r\r\n geschrieben, da unter Windows text der Modus \n in \r\n übersetzt wird.

In Python 3 wurde die erforderliche Syntax geändert. Öffnen Sie stattdessen outfile mit dem zusätzlichen Parameter newline=''.

Beispiele:

# Python 2
with open('/pythonwork/thefile_subset11.csv', 'wb') as outfile:
    writer = csv.writer(outfile)

# Python 3
with open('/pythonwork/thefile_subset11.csv', 'w', newline='') as outfile:
    writer = csv.writer(outfile)

Dokumentations-Links

581
Mark Tolonen

Das Öffnen der Datei im Binärmodus "wb" funktioniert in Python 3+ nicht. Oder Sie müssen Ihre Daten vor dem Schreiben in Binärdateien konvertieren. Das ist nur ein Ärger.

Sie sollten es stattdessen im Textmodus belassen, aber die Zeilenumbrüche als leer überschreiben. So wie:

with open('/pythonwork/thefile_subset11.csv', 'w', newline='') as outfile:
39
David Maddox

Die einfache Antwort ist, dass csv-Dateien immer im Binärmodus geöffnet werden sollten ob für Eingabe oder Ausgabe, da unter Windows sonst Probleme mit dem Zeilenende auftreten. Speziell bei der Ausgabe schreibt das csv-Modul \r\n (den standardmäßigen CSV-Zeilenabschlusszeichen), und dann (im Textmodus) ersetzt die Laufzeit das \n durch \r\n (das Windows-Standardzeilenabschlusszeichen), was ein Ergebnis von \r\r\n ergibt.

Das Fummeln mit der lineterminator ist NICHT die Lösung.

13
John Machin

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 :

Wenn es sich bei csvfile um ein Dateiobjekt handelt, muss es auf Plattformen, auf denen sich dies auswirkt, mit dem Flag „b“ geöffnet werden.

Windows ist eine solche Plattform, bei der das einen Unterschied macht. Das Ändern des Leitungsabschlusszeichens, wie ich es im Folgenden beschrieben habe, könnte das Problem behoben haben, das Problem könnte jedoch vollständig vermieden werden, indem die Datei im Binärmodus geöffnet wird. Man könnte sagen, dass diese Lösung "eleganter" ist. "Fiedeln" mit dem Leitungsabschlusszeichen 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 Auswirkung hat. dh. es führt zu systemübergreifendem Code.

Von Python Docs

Unter Windows wurde 'b' an den Modus angehängt öffnet die Datei im Binärmodus, also es gibt auch modi wie 'rb', 'wb', und 'r + b'. Python unter Windows macht eine Unterscheidung zwischen Text und binär Dateien; die Zeilenendezeichen in Textdateien werden automatisch geändert etwas, wenn Daten gelesen oder geschrieben werden . Diese Änderung hinter den Kulissen von Dateidaten sind für ASCII Text .__ geeignet. Dateien, aber es werden die binären Daten beschädigt. wie das in JPEG- oder EXE-Dateien. Sein Verwenden Sie den binären Modus sehr sorgfältig, wenn Lesen und Schreiben solcher Dateien. Auf Unix, es schadet nicht, ein 'b' anzuhängen in den Modus, damit Sie es verwenden können plattformunabhängig für alle binären Dateien.

Original:

Wenn Sie zusätzliche Leerzeilen erhalten, müssen Sie als Teil optionaler Parameter für den csv.writer den Lineterminator (info here ) ändern. Beispiel unten angepasst an die Python-Seite csv-Dokumente. Ändern Sie es von '\ n' in was auch immer es sein sollte. Da dies nur ein Stich im Dunkeln des Problems ist, funktioniert es vielleicht nicht, aber das ist meine beste Vermutung.

>>> import csv
>>> spamWriter = csv.writer(open('eggs.csv', 'w'), lineterminator='\n')
>>> spamWriter.writerow(['Spam'] * 5 + ['Baked Beans'])
>>> spamWriter.writerow(['Spam', 'Lovely Spam', 'Wonderful Spam'])
6
Derek Litz

Ich schreibe diese Antwort w.r.t. auf python 3, da ich anfangs das gleiche problem habe.

Ich sollte Daten von Arduino mit PySerial abrufen und in eine CSV-Datei schreiben. Jede Lesung in meinem Fall endete mit '\r\n', So dass immer eine neue Zeile jede Zeile trennte.

In meinem Fall hat die Option newline='' Nicht funktioniert. Weil es einen Fehler zeigte wie:

with open('op.csv', 'a',newline=' ') as csv_file:

ValueError: illegal newline value: ''

Es schien also, als würden sie das Auslassen von Zeilenumbrüchen hier nicht akzeptieren.

Als ich nur eine der Antworten hier sah, erwähnte ich den Zeilenabschluss im Writer-Objekt wie:

writer = csv.writer(csv_file, delimiter=' ',lineterminator='\r')

und das hat bei mir funktioniert, weil ich die zusätzlichen Zeilen übersprungen habe.

4
Debanjan Dey

Verwenden Sie die unten definierte Methode, um Daten in die CSV-Datei zu schreiben.

open('outputFile.csv', 'a',newline='')

Fügen Sie einfach einen zusätzlichen newline=''-Parameter in die open-Methode ein:

def writePhoneSpecsToCSV():
    rowData=["field1", "field2"]
    with open('outputFile.csv', 'a',newline='') as csv_file:
        writer = csv.writer(csv_file)
        writer.writerow(rowData)

Dadurch werden CSV-Zeilen geschrieben, ohne dass zusätzliche Zeilen erstellt werden!

0
Febin Mathew
with open(destPath+'\\'+csvXML, 'a+') as csvFile:
    writer = csv.writer(csvFile, delimiter=';', lineterminator='\r')
    writer.writerows(xmlList)

Der "lineterminator = '\ r'" erlaubt den Übergang zur nächsten Zeile, ohne eine leere Zeile zwischen zwei.

0
SheRa

Bei Verwendung von Python 3 können die leeren Zeilen durch Verwendung des Moduls codecs vermieden werden. Wie in der Dokumentation angegeben, werden Dateien im Binärmodus geöffnet, sodass keine Änderung des Newline-Kwargs erforderlich ist. Ich bin vor kurzem auf die gleiche Ausgabe gestoßen und das hat für mich funktioniert:

with codecs.open( csv_file,  mode='w', encoding='utf-8') as out_csv:
     csv_out_file = csv.DictWriter(out_csv)
0
JBa