706 Stimmen

Mit Python geschriebene CSV-Datei hat Leerzeilen zwischen den einzelnen Zeilen

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 lautet thefile.csv ein, nimmt Änderungen vor und schreibt die Ergebnisse in thefile_subset1 .

Wenn ich jedoch die resultierende csv-Datei in Microsoft Excel öffne, gibt es nach jedem Datensatz eine zusätzliche Leerzeile!

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

1385voto

Mark Tolonen Punkte 146757

El csv.writer Modul steuert direkt die Zeilenenden und schreibt \r\n direkt in die Datei einfügen. Unter Python 3 muss die Datei im unübersetzten Textmodus mit den Parametern geöffnet werden 'w', newline='' (leere Zeichenkette) oder es wird geschrieben \r\r\n unter Windows, wo der Standard-Textmodus jeden Text übersetzen wird \n in \r\n .

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

Sur Python 2 verwenden Sie den Binärmodus zum Öffnen outfile mit Modus 'wb' anstelle von 'w' um die Windows-Übersetzung von Zeilenumbrüchen zu verhindern. Python 2 hat auch Probleme mit Unicode und erfordert andere Workarounds, um Nicht-ASCII-Text zu schreiben. Siehe den Python 2-Link unten und den UnicodeReader y UnicodeWriter Beispiele am Ende der Seite, wenn Sie mit dem Schreiben von Unicode-Zeichenfolgen in CSV-Dateien unter Python 2 zu tun haben, oder schauen Sie sich die 3rd-Party unicodecsv Modul:

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

Links zur Dokumentation

89voto

David Maddox Punkte 1674

Das Öffnen der Datei im Binärmodus "wb" wird in Python 3+ nicht funktionieren. Oder besser gesagt, Sie müssen Ihre Daten vor dem Schreiben in den Binärmodus konvertieren. Das ist einfach nur lästig.

Stattdessen sollten Sie den Textmodus beibehalten, aber den Zeilenumbruch als leer überschreiben. Zum Beispiel so:

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

15voto

Derek Litz Punkte 9943

Hinweis: Es scheint, dass dies nicht die bevorzugte Lösung ist, da die zusätzliche Zeile auf einem Windows-System hinzugefügt wurde. Wie in der Python-Dokument :

Wenn csvfile ein Dateiobjekt ist, muss es auf Plattformen, auf denen das einen Unterschied macht, mit dem Flag 'b' geöffnet werden.

Windows ist eine der Plattformen, bei denen das einen Unterschied macht. Durch das Ändern des Zeilenabschlusses, wie ich es weiter unten beschrieben habe, konnte das Problem zwar behoben werden, aber man könnte es ganz vermeiden, indem man die Datei im Binärmodus öffnet. Man könnte sagen, dass diese Lösung "eleganter" ist. Das "Herumspielen" mit dem Zeilenterminator hätte in diesem Fall wahrscheinlich zu nicht portierbarem Code zwischen verschiedenen Systemen geführt, während das Öffnen einer Datei im Binärmodus auf einem Unix-System keine Auswirkungen hat, d. h. es führt zu systemübergreifend kompatiblem Code.

Von Python-Dokumente :

Unter Windows öffnet ein 'b' an den Modus angehängt die Datei im Binärmodus geöffnet, so dass gibt es auch Modi wie 'rb', 'wb', und 'r+b'. Python unter Windows macht einen Unterscheidung zwischen Text- und Binär Dateien; die Zeilenendezeichen in Textdateien werden automatisch leicht verändert leicht verändert, wenn Daten gelesen oder geschrieben werden. Diese hinter den Kulissen stattfindende Modifikation von Dateidaten ist in Ordnung für ASCII-Textdateien Dateien in Ordnung, aber sie beschädigt binäre Daten wie die in JPEG- oder EXE-Dateien. Seien Sie sehr vorsichtig sein, den Binärmodus zu verwenden, wenn beim Lesen und Schreiben solcher Dateien. Unter Unix schadet es nicht, ein 'b' an den Modus anzuhängen an den Modus anzuhängen, damit Sie ihn verwenden können plattformunabhängig für alle binären Dateien verwenden können.

Original :

Als Teil der optionalen Parameter für den csv.writer, wenn Sie zusätzliche Leerzeilen erhalten, müssen Sie möglicherweise den Linienterminator ändern (info aquí ). Das folgende Beispiel wurde von der Python-Seite übernommen csv-Dokumente. Ändern Sie es von ' \n ' zu dem, was es sein sollte. Da dies nur ein Stich im Dunkeln auf das Problem kann dies oder nicht funktionieren, aber es 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'])

15voto

AustinDahl Punkte 782

Viele der anderen Antworten sind in den zehn Jahren, die seit der ursprünglichen Frage vergangen sind, nicht mehr aktuell. Für Python3 ist die Antwort direkt in der Dokumentation :

Wenn csvfile ein Dateiobjekt ist, sollte es mit newline=''

El Fußnote näher erläutert:

Wenn newline='' nicht angegeben wird, werden in Anführungszeichen eingebettete Zeilenumbrüche nicht korrekt interpretiert, und auf Plattformen, die \r\n Linings auf ein Extra schreiben \r hinzugefügt werden. Es sollte immer sicher sein, newline='' anzugeben, da das csv-Modul seine eigene (universelle) Behandlung von Zeilenumbrüchen vornimmt.

12voto

John Machin Punkte 78125

Die einfache Antwort ist, dass csv-Dateien sollten immer im Binärmodus geöffnet werden sowohl für die Eingabe als auch für die Ausgabe, da es sonst unter Windows zu Problemen mit den Zeilenenden kommt. Speziell bei der Ausgabe schreibt das csv-Modul \r\n (das Standard-CSV-Zeilenterminal) und dann (im Textmodus) ersetzt die Laufzeitumgebung die \n por \r\n (der Windows-Standard-Zeilenabschluß), was zu einem Ergebnis von \r\r\n .

Fummeln mit dem lineterminator ist NICHT die Lösung.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X