Ich arbeite 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 löst diesen Fehler aus:
file my.csv, line 1: line contains NULL byte
Was kann ich tun? Google scheint darauf hinzuweisen, dass es sich möglicherweise um eine Excel-Datei handelt, die nicht ordnungsgemäß als CSV-Datei gespeichert wurde. Gibt es eine Möglichkeit, dieses Problem in Python zu umgehen?
== UPDATE ==
Nach dem Kommentar von @ JohnMachin unten habe ich versucht, diese Zeilen zu meinem Skript hinzuzufügen:
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 bekommen habe:
'\xd0\xcf\x11\xe0\xa1\xb1\x1a\xe1\x00\x00\x00\x00\x00\x00\x00\x00\ .... <snip>
8
13834
Die Datei enthält also tatsächlich NUL-Bytes.
od -c
die erste Zeile aus?Antworten:
Wie @ S.Lott sagt, sollten Sie Ihre Dateien im 'rb'-Modus und nicht im' rU'-Modus öffnen. Dies kann jedoch NICHT zu Ihrem aktuellen Problem führen. Soweit ich weiß, würde die Verwendung des 'rU'-Modus Sie durcheinander bringen, wenn
\r
in die Daten eingebettet sind , aber keine anderen Dramen verursachen. Ich stelle auch fest, dass Sie mehrere Dateien haben (alle mit 'rU' geöffnet?), Aber nur eine, die ein Problem verursacht.Wenn das CSV-Modul angibt, dass Ihre Datei ein "NULL" -Byte (dumme Nachricht, sollte "NUL" sein) enthält, müssen Sie überprüfen, was sich in Ihrer Datei befindet. Ich würde vorschlagen, dass Sie dies auch dann tun, wenn die Verwendung von 'rb' das Problem beseitigt.
repr()
ist (oder will) dein Debugging-Freund. Es wird auf plattformunabhängige Weise eindeutig zeigen, was Sie haben (was für Helfer hilfreich ist, die nicht wissen, wasod
ist oder tut). Mach das:und kopieren Sie das Ergebnis sorgfältig in eine Bearbeitung Ihrer Frage (nicht in einen Kommentar).
Beachten Sie auch, dass, wenn die Datei wirklich zwielichtig ist, z. B. no \ r oder \ n, in angemessener Entfernung vom Dateianfang, die von gemeldete Zeilennummer
reader.line_num
(nicht hilfreich) 1\x00
lautet. 1. Finden Sie, wo sich die erste befindet (falls vorhanden), indem Sie dies tunund stellen Sie sicher, dass Sie mindestens so viele Bytes mit repr oder od sichern.
Was
data.count('\x00')
sagt dir das? Wenn es viele gibt, möchten Sie vielleicht so etwas tundamit Sie die NUL-Bytes im Kontext sehen können.
Wenn Sie
\x00
in der Ausgabe (oder\0
in Ihrerod -c
Ausgabe) sehen können, haben Sie definitiv NUL-Bytes in der Datei, und Sie müssen Folgendes tun:Haben Sie sich die Datei (einschließlich der letzten Zeilen) übrigens mit einem Texteditor angesehen? Sieht es tatsächlich aus wie eine vernünftige CSV-Datei wie die anderen (keine "NULL-Byte" -Ausnahme) Dateien?
quelle
'\xd0\xcf\x11\xe0\xa1\xb1\x1a\xe1
ist die "Signatur", die eine zusammengesetzte OLE2-Dokumentdatei bezeichnet - z. B. eine Excel 97-2003 .XLS-Datei . Ich finde "in einem Texteditor sieht es aus wie eine absolut vernünftige CSV-Datei" absolut unglaublich . Sie müssen eine andere Datei, eine gültige CSV-Datei, in einem anderen Ordner oder auf einem anderen Computer oder zu einem anderen Zeitpunkt angesehen haben. Beachten Sie, dass Ihreod
Ausgabe nicht aus einer XLS-Datei stammt.csv.reader
direkt an übergeben werden kann.fo.write(data.replace('\x00', ''))
seinfo.write(data.replace(b'\x00', b''))
? Python 3.6 hier ...Das funktioniert bei mir.
quelle
Es als UTF-16 zu lesen war auch mein Problem.
Hier ist mein Code, der funktioniert hat:
Wo Speicherort ist das Verzeichnis Ihrer CSV-Datei.
quelle
Ich bin auch auf dieses Problem gestoßen. Mit dem Python-
csv
Modul habe ich versucht, eine in MS Excel erstellte XLS-Datei zu lesen und bin auf denNULL byte
Fehler gestoßen, den Sie erhalten haben. Ich sah mich um und fand das xlrd Python-Modul zum Lesen und Formatieren von Daten aus MS Excel-Tabellenkalkulationsdateien. Mit demxlrd
Modul kann ich nicht nur die Datei richtig lesen, sondern auch auf viele verschiedene Teile der Datei zugreifen, wie ich es vorher nicht konnte.Ich dachte, es könnte dir helfen.
quelle
Das Konvertieren der Codierung der Quelldatei von UTF-16 nach UTF-8 löst mein Problem.
Wie konvertiere ich eine Datei in Python in utf-8?
quelle
Sie können einfach einen Generator einbinden, um die Nullwerte herauszufiltern, wenn Sie so tun möchten, als ob sie nicht existieren. Dies setzt natürlich voraus, dass die Null-Bytes nicht wirklich Teil der Codierung sind und wirklich eine Art fehlerhaftes Artefakt oder Fehler sind.
quelle
Warum tust du das?
Die Dokumente sind ziemlich klar, dass Sie dies tun müssen:
Der Modus muss zum Lesen "rb" sein.
http://docs.python.org/library/csv.html#csv.reader
quelle
od
einem Texteditor ablegt oder in einem Texteditor betrachtet, sieht es aus wie eine ganz normale CSV-Datei. Wenn er jedoch die ersten Bytes mit Python repr () speichert, sieht es wie eine Excel-XLS-Datei aus (die in eine CSV-Erweiterung umbenannt wurde).Anscheinend handelt es sich um eine XLS-Datei und nicht um eine CSV-Datei, wie http://www.garykessler.net/library/file_sigs.html bestätigt
quelle
Anstelle des CSV-Readers verwende ich die Funktion zum Lesen von Dateien und Teilen für Zeichenfolgen:
quelle
Ich habe den gleichen Fehler bekommen. Die Datei wurde in UTF-8 gespeichert und es hat funktioniert.
quelle
Dies ist mir passiert, als ich mit OpenOffice Calc eine CSV-Datei erstellt habe. Es ist nicht passiert, als ich die CSV-Datei in meinem Texteditor erstellt habe, auch wenn ich sie später mit Calc bearbeitet habe.
Ich habe mein Problem gelöst, indem ich die Daten aus meiner von Calc erstellten Datei in eine vom Editor erstellte Datei in meinen Texteditor kopiert habe.
quelle
Ich hatte das gleiche Problem beim Öffnen einer CSV, die von einem Webservice erstellt wurde, der NULL-Bytes in leere Header einfügte. Ich habe Folgendes getan, um die Datei zu bereinigen:
Haftungsausschluss: Beachten Sie, dass dadurch Ihre Originaldaten überschrieben werden. Stellen Sie sicher, dass Sie eine Sicherungskopie davon haben. Du wurdest gewarnt!
quelle
Für all diese 'rU'-Dateimodus-Hasser: Ich habe gerade versucht, eine CSV-Datei von einem Windows-Computer auf einem Mac mit dem' rb'-Dateimodus zu öffnen, und habe diesen Fehler vom CSV-Modul erhalten:
Das Öffnen der Datei im 'rU'-Modus funktioniert einwandfrei. Ich liebe den Universal-Newline-Modus - er erspart mir so viel Ärger.
quelle
Ich bin darauf gestoßen, als ich Scrapy verwendet und eine komprimierte CSV-Datei abgerufen habe, ohne über eine korrekte Middleware zum Entpacken des Antwortkörpers zu verfügen, bevor er an den CSV-Reader übergeben wurde. Daher war die Datei nicht wirklich eine CSV-Datei und warf den
line contains NULL byte
Fehler entsprechend.quelle
Haben Sie versucht, gzip.open zu verwenden?
Ich habe versucht, eine Datei zu öffnen, die komprimiert wurde, aber die Erweiterung '.csv' anstelle von 'csv.gz' hatte. Dieser Fehler trat immer wieder auf, bis ich gzip.open verwendete
quelle
Ein Fall ist: - Wenn die CSV-Datei leere Zeilen enthält, kann dieser Fehler auftreten. Überprüfen Sie, ob eine Zeile erforderlich ist, bevor Sie mit dem Schreiben oder Lesen fortfahren.
Ich habe mein Problem gelöst, indem ich diese Prüfung in den Code eingefügt habe.
quelle