Python CSV-Fehler: Zeile enthält NULL-byte
Arbeite ich mit einigen CSV-Dateien mit dem folgenden code:
reader = csv.reader(open(filepath, "rU"))
try:
for row in reader:
print 'Row read successfully!', row
except csv.Error, e:
sys.exit('file %s, line %d: %s' % (filename, reader.line_num, e))
Und eine Datei wirft diesen Fehler:
file my.csv, line 1: line contains NULL byte
Was kann ich tun? Google scheint vorzuschlagen, dass es möglicherweise eine Excel-Datei, die gespeichert wurden, als ein .csv falsch. Gibt es eine Möglichkeit, die ich bekommen kann um dieses problem in Python?
== UPDATE ==
Folgende @JohnMachin Kommentar unten, ich habe versucht, das hinzufügen dieser Zeilen in meinem Skript:
print repr(open(filepath, 'rb').read(200)) # dump 1st 200 bytes of file
data = open(filepath, 'rb').read()
print data.find('\x00')
print data.count('\x00')
- Und das ist die Ausgabe, die ich bekam:
'\xd0\xcf\x11\xe0\xa1\xb1\x1a\xe1\x00\x00\x00\x00\x00\x00\x00\x00\ .... <snip>
8
13834
Also die Datei enthält tatsächlich NUL-bytes.
Was bedeutet
wie Sie die Abfrage sollte ich laufen, so etwas wie meine Katze.csv - | od -c | mehr ? mit, dass ich bekommen: 0000000 D e p a r t m e n t-F a m i l
Wie ist die CSV-erzeugt ? Aus excel können Sie in der Lage sein, zu versuchen, ein Dialekt. Ansonsten schauen, sagen: stackoverflow.com/questions/2753022/...
Danke. Es ist nicht meine CSV, und leider habe ich nicht die macht, es zu ändern. Ich denke, dass es erstellt wurde, als Excel speichern als CSV-Datei (boo). Ein Dialekt, der klingt wie eine gute Idee - ich werde das ausprobieren!
Wenn es eigentlich schon gespeichert als CSV-Datei, sollte es funktionieren. Eine Sache, die ich manchmal finde, ist der TSV (tab-getrennt) - Dateien getarnt als CSV, so dass Sie könnten versuchen, Einstellung ein Trennzeichen '\t'. Wenn es gespeichert worden ist, als eine Excel-Datei, und die Erweiterung verändert das CSV-Format, kein Dialekt ist, zur Arbeit zu gehen. Ich denke, deine einzige option in diesem Fall wäre die Verwendung von Excel zum speichern von Kopien als die entsprechende CSV-Datei.
od -c
sagen, dass die erste Zeile sieht so aus?wie Sie die Abfrage sollte ich laufen, so etwas wie meine Katze.csv - | od -c | mehr ? mit, dass ich bekommen: 0000000 D e p a r t m e n t-F a m i l
Wie ist die CSV-erzeugt ? Aus excel können Sie in der Lage sein, zu versuchen, ein Dialekt. Ansonsten schauen, sagen: stackoverflow.com/questions/2753022/...
Danke. Es ist nicht meine CSV, und leider habe ich nicht die macht, es zu ändern. Ich denke, dass es erstellt wurde, als Excel speichern als CSV-Datei (boo). Ein Dialekt, der klingt wie eine gute Idee - ich werde das ausprobieren!
Wenn es eigentlich schon gespeichert als CSV-Datei, sollte es funktionieren. Eine Sache, die ich manchmal finde, ist der TSV (tab-getrennt) - Dateien getarnt als CSV, so dass Sie könnten versuchen, Einstellung ein Trennzeichen '\t'. Wenn es gespeichert worden ist, als eine Excel-Datei, und die Erweiterung verändert das CSV-Format, kein Dialekt ist, zur Arbeit zu gehen. Ich denke, deine einzige option in diesem Fall wäre die Verwendung von Excel zum speichern von Kopien als die entsprechende CSV-Datei.
InformationsquelleAutor AP257 | 2010-11-12
Du musst angemeldet sein, um einen Kommentar abzugeben.
Als @S. Lott sagt, sollten Sie das öffnen von Dateien in 'rb' - Modus, nicht 'rU' - Modus. Jedoch, dass kann NICHT sein, was Sie Ihrem aktuellen problem. Soweit ich weiß, mit 'rU' - Modus würden Sie Durcheinander zu bringen, wenn es eingebettet
\r
in den Daten aber nicht zu anderen Dramen. Ich auch beachten Sie, dass Sie mehrere Dateien (alle geöffnet, die mit 'rU' ??) aber nur eine, die das problem verursacht.Wenn die csv-Modul sagt, dass Sie eine "NULL" (dumme Nachricht, sollte "NUL") byte in der Datei, dann müssen Sie check out was ist in deiner Datei. Ich würde vorschlagen, dass Sie dies auch tun, wenn mit 'rb' macht das problem Weg.
repr()
ist (oder sein will) Sie Ihre debugging-Freund. Es wird sich zeigen eindeutig, was du hast, in eine plattformunabhängige Art und Weise (die hilfreich für Helfer, die nicht bewusst sind, wasod
ist oder nicht). Tun Sie dies:sorgfältig und kopieren/einfügen (nicht Abtippen) das Ergebnis in ein edit der Frage (nicht in einem Kommentar).
Beachten Sie auch, dass wenn die Datei wirklich dodgy z.B. kein \r oder \n in angemessener Entfernung von dem start der Datei, die Nummer der Zeile gemeldet, die von
reader.line_num
werden (unhelpfully) 1. Finden, wo die ersten\x00
ist (falls vorhanden), indem erund stellen Sie sicher, dass Sie ausgeben zumindest, dass viele bytes mit oder repr od.
Was bedeutet
data.count('\x00')
sagen Sie? Wenn es viele sind, möchten Sie vielleicht, etwas zu tun, wieso dass Sie sehen können, die NUL-bytes im Kontext.
Wenn Sie sehen können
\x00
in der Ausgabe (oder\0
in Ihremod -c
Ausgang), dann haben Sie auf jeden Fall NUL-byte(s) in der Datei, und Sie müssen, um etwas wie das hier tun:Übrigens, haben Sie schaute auf die Datei (einschließlich der letzten paar Zeilen) mit einem text-editor? Tut es eigentlich Aussehen, wie eine vernünftige CSV-Datei wie die anderen (keine "NULL-byte" - Ausnahme) - Dateien?
ist die "Signatur" bezeichnet eine OLE2-Compound-Dokument-Datei wie z.B. Excel 97-2003 .XLS-Datei. Ich finde "in einem text-editor, sieht es aus wie eine vollkommen vernünftige CSV-Datei", werden Sie völlig unglaublichen. Sie müssen sich eine andere Datei, eine gültige CSV-Datei in einen anderen Ordner oder auf einem anderen Rechner oder zu einem anderen Zeitpunkt. Beachten Sie, dass Ihre
od
Ausgang nicht aus einer XLS-Datei.Einen bestimmten Grund, dass Sie noch nicht akzeptiert diese Antwort?
Funktioniert, sollte aber möglich sein und schön on-the-fly mit einem Datei-ähnliches Objekt, das filtert die CSV und übergeben werden kann, um
csv.reader
direkt.Ich denke
od
ist ein Tippfehler füros
in dieser Antwort.InformationsquelleAutor John Machin
Lesen als UTF-16 war auch mein problem.
Hier ist mein code, der landete:
Wo der Speicherort ist das Verzeichnis der csv-Datei.
InformationsquelleAutor User
Dies funktioniert für mich.
InformationsquelleAutor double
Stieß ich auf dieses problem auch. Mit Hilfe der Python -
csv
Modul, das ich versuchte zu Lesen, eine XLS-Datei erstellt, die in MS Excel und läuft in dieNULL byte
Fehler, die Sie immer waren. Ich sah mich um und fand die xlrd Python-Modul für das Lesen und formatieren von Daten aus MS-Excel-spreadsheet-Dateien. Mit derxlrd
Modul, ich bin nicht nur in der Lage die Datei zu Lesen, richtig, aber ich kann auch Zugriff auf verschiedene Teile der Datei in einer Weise, ich konnte nicht vor.Ich dachte, es könnte dir helfen.
InformationsquelleAutor ayaz
Konvertierung der Kodierung der Quellcode-Datei von UTF-16 auf UTF-8 lösen mein problem.
So konvertieren Sie eine Datei in utf-8 in Python?
InformationsquelleAutor Patrick Halley
Könnte man nur die inline-generator heraus zu filtern, die null-Werte, wenn Sie wollen, so tun Sie nicht existieren. Dies ist natürlich vorausgesetzt, die null-bytes sind eigentlich nicht die Kodierung und wirklich sind eine Art von fehlerhaften Artefakt oder Fehler.
InformationsquelleAutor woot
Warum tust du das?
Die Doku ist ziemlich klar, dass Sie dies tun muss:
Der Modus muss "rb" zu Lesen.
http://docs.python.org/library/csv.html#csv.reader
Hilfe"? Bedeutet was? Alle spezifischen Fehlermeldungen?
Das bedeutet, er bekommt die gleiche Antwort wie zuvor. Die Realität ist, dass er sich mit einem Chamäleon oder gestaltenwandler-Datei ... wenn er dumps Sie mit
od
oder sieht es in einem text-editor, sieht es aus wie eine ganz normale CSV-Datei. Aber wenn er dumps in den ersten paar bytes mit Python repr(), macht es wie ein Excel .XLS-Datei (wurde umbenannt, um eine CSV-Erweiterung).Mit diesen Inhalten, macht es Sinn, dass die csv-Modul nicht verarbeiten, aber die xlrd-Modul verarbeiten können. Vernünftig, weder Modul folgert nichts aus dem Namen der Eingabedatei, wenn in der Tat die Eingabe ist eine Datei mit einem Namen.
Machin: "weder Modul folgert nichts aus dem Namen der Eingabedatei". Wahr. Meine application framework hängt davon ab, dass der Tat. Wir Vertrauen Sie nicht auf die mit dem Namen nichts bedeuten, da Menschen Fehler machen ("Lüge"). Wir haben also zu überprüfen, eine Reihe von alternativen, bis man klickt.
InformationsquelleAutor S.Lott
appparently es ist eine XLS-Datei und nicht die CSV-Datei als http://www.garykessler.net/library/file_sigs.html bestätigen
Mit dieser magischen Zahl, dass es die Ursache XLSX haben unterschiedliche Magische Zahl
InformationsquelleAutor Xavier Combelle
Statt der csv-reader ich benutzen, Lesen Sie die Datei-und split-Funktion für string:
InformationsquelleAutor Nico The Brush
Ich habe den gleichen Fehler. Gespeichert wird die Datei in UTF-8 und es funktionierte.
InformationsquelleAutor mikaiscute
Passiert mir, wenn ich Sie erstellt eine CSV Datei mit OpenOffice Calc. Es ist nicht geschehen, wenn ich die CSV-Datei in meinem Texteditor, auch wenn ich später bearbeitet es mit Calc.
Ich löste mein problem durch kopieren-einfügen in meinen text-editor die Daten aus meinem Calc-Datei erstellt, um eine neue editor-Datei erstellt.
InformationsquelleAutor user1990371
Ich hatte das gleiche problem beim öffnen einer CSV-produziert von einem webservice eingefügt, die NULL-bytes in leer-Header. Ich habe die folgenden, um die Datei zu bereinigen:
Haftungsausschluss:
Werden Sie sich bewusst, dass dies überschreibt Ihre original-Daten. Stellen Sie sicher, dass Sie eine backup-Kopie. Sie wurden gewarnt!
InformationsquelleAutor Matthias Kuhn
Für alle, die 'rU' filemode-Hasser: ich habe nur versucht, öffnen Sie eine CSV-Datei von einer Windows Maschine auf einen Mac mit dem 'rb' filemode und ich habe diesen Fehler aus der csv-Modul:
Öffnen der Datei in 'rU' - Modus funktioniert einwandfrei. Ich Liebe universal-newline-Modus-es spart mir so viel ärger.
InformationsquelleAutor Bill Gross
Dass ich auf diese bei der Verwendung von scrapy und Holen einer Zip csvfile, ohne eine richtige middleware zum entpacken der Antwort body vor der aushändigung an den csvreader. Daher wurde die Datei nicht wirklich eine csv-Datei und warf die
line contains NULL byte
Fehler entsprechend.InformationsquelleAutor Gesias
Haben Sie versucht, mit Hilfe von gzip.öffnen?
Ich versuche, eine Datei zu öffnen hatte, wurden komprimiert, aber hatte die extension '.csv', statt 'csv.gz'. Dieser Fehler gezeigt hätten, bis ich gzip verwendet.öffnen
InformationsquelleAutor Munene iUwej Julius
Einem Fall ist, dass - Wenn die CSV-Datei enthält leere Zeilen dieser Fehler kann auftauchen. Check für Zeile ist notwendig, bevor wir fortfahren, zu schreiben oder zu Lesen.
Ich mein Problem gelöst, durch hinzufügen dieser check-in-code.
InformationsquelleAutor kirancodify