Ich versuche, ein Programm zu schreiben, das eine CSV-Datei (input.csv) betrachtet und nur die Zeilen neu schreibt, die mit einem bestimmten Element (korrigiert.csv) beginnen, wie in einer Textdatei (output.txt) aufgeführt.
So sieht mein Programm jetzt aus:
import csv
lines = []
with open('output.txt','r') as f:
for line in f.readlines():
lines.append(line[:-1])
with open('corrected.csv','w') as correct:
writer = csv.writer(correct, dialect = 'excel')
with open('input.csv', 'r') as mycsv:
reader = csv.reader(mycsv)
for row in reader:
if row[0] not in lines:
writer.writerow(row)
Leider bekomme ich diesen Fehler immer wieder und ich habe keine Ahnung, worum es geht.
Traceback (most recent call last):
File "C:\Python32\Sample Program\csvParser.py", line 12, in <module>
for row in reader:
_csv.Error: line contains NULL byte
Wir danken allen Menschen hier , um mich an diesen Punkt zu bringen.
for row in reader
Schleife erhöhen.open('input.csv').read().index('\0')
Wenn Sie dies tun, erhalten Sie den Versatz des ersten.Antworten:
Ich habe ein ähnliches Problem mit einer einfacheren Lösung gelöst:
Der Schlüssel war die Verwendung des Codecs-Moduls, um die Datei mit der UTF-16-Codierung zu öffnen. Es gibt viel mehr Codierungen. Überprüfen Sie die Dokumentation .
quelle
csv.reader()
liegen, diese nicht verarbeitet werden können und SieUnicodeEncodeError
stattdessen s erhalten.UnicodeError: UTF-16 stream does not start with BOM
'utf-16le'
.Ich vermute, Sie haben ein NUL-Byte in input.csv. Sie können das mit testen
wenn Sie tun,
kann Sie um das herum bringen. Oder es zeigt an, dass Sie utf16 oder etwas 'Interessantes' in der CSV-Datei haben.
quelle
file input.csv
, um den Dateityp zu identifizieren?reader = csv.reader(mycsv, delimiter='\t')
. Ich stelle mir vor, dass der CSV-Reader Ihre gesamte Datei verschlingt, nach Kommas sucht und bis zur EOF gelangt. Aber Sie haben definitiv ein Codierungsproblem. Sie müssen die Codierung beim Öffnen der Datei angeben.Wenn Sie die Nullen durch etwas ersetzen möchten, können Sie dies tun:
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.
Siehe
(line.replace('\0','') for line in f)
unten, außerdem möchten Sie diese Datei wahrscheinlich im Modus öffnenrb
.quelle
Hier erfahren Sie, in welcher Leitung das Problem liegt.
Vielleicht wäre dies von daniweb hilfreich:
...
quelle
Traceback (most recent call last): File "C:\Python32\Sample Program\csvParser.py", line 17, in <module> print ('csv choked on line %s' % (i+1)) NameError: name 'i' is not defined
print(open('input.csv', 'r').readlines()[0])
ÿþ/
<Das ist alles, was es einfügen würde (es sind hauptsächlich Blöcke und Zahlen)Ein kniffliger Weg:
Wenn Sie sich unter Lunux entwickeln, können Sie die gesamte Kraft von sed nutzen :
Die effizienteste Lösung für große Dateien.
Überprüft auf Python3, Kubuntu
quelle
Ich habe dieses Problem kürzlich behoben und in meinem Fall war es eine komprimierte Datei, die ich lesen wollte. Überprüfen Sie zuerst das Dateiformat. Überprüfen Sie dann, ob der Inhalt der Erweiterung entspricht.
quelle
Die Umwandlung meiner Linux-Umgebung in eine saubere, vollständige UTF-8-Umgebung war für mich der Trick. Versuchen Sie Folgendes in Ihrer Befehlszeile:
quelle
Dies ist seit langem geklärt, aber ich bin auf diese Antwort gestoßen, weil beim Lesen einer CSV, die als Trainingsdaten in Keras und TensorFlow verarbeitet werden soll, ein unerwarteter Fehler aufgetreten ist.
In meinem Fall war das Problem viel einfacher und es lohnt sich, sich dessen bewusst zu sein. Die in der CSV erzeugten Daten waren nicht konsistent, was dazu führte, dass einige Spalten vollständig fehlten, was diesen Fehler ebenfalls zu verursachen scheint.
Die Lektion: Wenn Sie diesen Fehler sehen, überprüfen Sie, ob Ihre Daten so aussehen, wie Sie denken, dass dies der Fall ist!
quelle
pandas.read_csv behandelt jetzt die unterschiedliche UTF-Codierung beim Lesen / Schreiben und kann daher direkt mit Null-Bytes umgehen
Siehe https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.read_csv.html
quelle