Ich führe ein Programm aus, das 30.000 ähnliche Dateien verarbeitet. Eine zufällige Anzahl von ihnen stoppt und erzeugt diesen Fehler ...
File "C:\Importer\src\dfman\importer.py", line 26, in import_chr
data = pd.read_csv(filepath, names=fields)
File "C:\Python33\lib\site-packages\pandas\io\parsers.py", line 400, in parser_f
return _read(filepath_or_buffer, kwds)
File "C:\Python33\lib\site-packages\pandas\io\parsers.py", line 205, in _read
return parser.read()
File "C:\Python33\lib\site-packages\pandas\io\parsers.py", line 608, in read
ret = self._engine.read(nrows)
File "C:\Python33\lib\site-packages\pandas\io\parsers.py", line 1028, in read
data = self._reader.read(nrows)
File "parser.pyx", line 706, in pandas.parser.TextReader.read (pandas\parser.c:6745)
File "parser.pyx", line 728, in pandas.parser.TextReader._read_low_memory (pandas\parser.c:6964)
File "parser.pyx", line 804, in pandas.parser.TextReader._read_rows (pandas\parser.c:7780)
File "parser.pyx", line 890, in pandas.parser.TextReader._convert_column_data (pandas\parser.c:8793)
File "parser.pyx", line 950, in pandas.parser.TextReader._convert_tokens (pandas\parser.c:9484)
File "parser.pyx", line 1026, in pandas.parser.TextReader._convert_with_dtype (pandas\parser.c:10642)
File "parser.pyx", line 1046, in pandas.parser.TextReader._string_convert (pandas\parser.c:10853)
File "parser.pyx", line 1278, in pandas.parser._string_box_utf8 (pandas\parser.c:15657)
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xda in position 6: invalid continuation byte
Die Quelle / Erstellung dieser Dateien stammt alle vom selben Ort. Wie kann dies am besten korrigiert werden, um mit dem Import fortzufahren?
cp1252
möglicherweise vorzuzieheniso-8859-1
.pd.read_csv('immigration.csv', encoding = "ISO-8859-1", engine='python')
für mich gearbeitetANSI
. Um es herauszufinden, habe ich die CSV geöffnet undnotepad
dann auf geklicktsave as
. Dort wird die Codierung neben der Schaltfläche Speichern angezeigt.Einfachste aller Lösungen:
Alternative Lösung:
Dann können Sie Ihre Datei wie gewohnt lesen:
und die anderen verschiedenen Codierungstypen sind:
quelle
encoding='iso-8859-1'
Verwenden Sie für eine bestimmte CSV-Datei, die sich gut mit öffnen lässt, stattdessenengine='python'
Würfe_csv.Error: field larger than field limit (131072)
.Pandas erlaubt die Angabe der Codierung, erlaubt jedoch nicht das Ignorieren von Fehlern, um die fehlerhaften Bytes nicht automatisch zu ersetzen. Es gibt also keine Einheitsgröße für alle Methoden, sondern je nach Anwendungsfall unterschiedliche Methoden.
Sie kennen die Codierung und es gibt keinen Codierungsfehler in der Datei. Großartig: Sie müssen nur die Codierung angeben:
Sie möchten sich nicht mit Codierungsfragen beschäftigen und möchten nur, dass diese verdammte Datei geladen wird, egal ob einige Textfelder Müll enthalten. Ok, Sie müssen nur die
Latin1
Codierung verwenden , da sie jedes mögliche Byte als Eingabe akzeptiert (und es in das Unicode-Zeichen desselben Codes konvertiert):Sie wissen, dass der größte Teil der Datei mit einer bestimmten Codierung geschrieben wurde, aber auch Codierungsfehler enthält. Ein Beispiel aus der Praxis ist eine UTF8-Datei, die mit einem Nicht-Utf8-Editor bearbeitet wurde und einige Zeilen mit einer anderen Codierung enthält. Pandas
open
sieht keine spezielle Fehlerverarbeitung vor, die Python- Funktion jedoch (unter der Annahme von Python3) undread_csv
akzeptiert ein dateiähnliches Objekt. Typische Fehlerparameter, die hier verwendet werden, sind,'ignore'
die nur die beleidigenden Bytes unterdrücken oder (IMHO besser)'backslashreplace'
die beleidigenden Bytes durch die umgekehrte Escape-Sequenz ihres Pythons ersetzen:quelle
Nach dem Ausführen dieses Codes finden Sie die Codierung von 'filename.csv' und führen den Code wie folgt aus
los geht's
quelle
In meinem Fall hat eine Datei
USC-2 LE BOM
laut Notepad ++ eine Codierung. Es istencoding="utf_16_le"
für Python.Hoffe, es hilft, eine Antwort für jemanden etwas schneller zu finden.
quelle
In meinem Fall funktionierte dies für Python 2.7:
Und nur für Python 3:
quelle
Versuchen Sie, die Engine = 'Python' anzugeben. Es hat bei mir funktioniert, aber ich versuche immer noch herauszufinden, warum.
quelle
Ich poste eine Antwort, um eine aktualisierte Lösung und Erklärung zu liefern, warum dieses Problem auftreten kann. Angenommen, Sie erhalten diese Daten aus einer Datenbank oder einer Excel-Arbeitsmappe. Wenn Sie Sonderzeichen wie haben
La Cañada Flintridge city
, werden SieUTF-8
Fehler einführen , es sei denn, Sie exportieren die Daten mithilfe der Codierung.La Cañada Flintridge city
wird werdenLa Ca\xf1ada Flintridge city
. Wenn Siepandas.read_csv
ohne Anpassung der Standardparameter verwenden, wird der folgende Fehler angezeigtZum Glück gibt es einige Lösungen.
Option 1 , korrigieren Sie den Export. Stellen Sie sicher, dass Sie die
UTF-8
Codierung verwenden.Option 2 : Wenn Ihnen
pandas.read_csv
das Beheben des Exportproblems nicht zur Verfügung steht und Sie es verwenden müssen , müssen Sie die folgenden Parameter einschließen :engine='python'
. Standardmäßig verwendet pandasengine='C'
die Funktion zum Lesen großer, sauberer Dateien, stürzt jedoch ab, wenn unerwartete Ereignisse auftreten. Nach meiner Erfahrung hat die Einstellung diesencoding='utf-8'
nie behobenUnicodeDecodeError
. Sie müssen es jedoch nicht verwendenerrors_bad_lines
, dies ist jedoch immer noch eine Option, wenn Sie es WIRKLICH benötigen.Option 3: Lösung ist meine bevorzugte persönliche Lösung. Lesen Sie die Datei mit Vanilla Python.
Ich hoffe, dies hilft Menschen, die zum ersten Mal auf dieses Problem stoßen.
quelle
Ich hatte eine Weile damit zu kämpfen und dachte, ich würde diese Frage posten, da es das erste Suchergebnis ist. Das Hinzufügen des
encoding="iso-8859-1"
Tags zu Pandasread_csv
funktionierte nicht und auch keine andere Codierung ergab weiterhin einen UnicodeDecodeError.Wenn Sie ein Dateihandle übergeben, müssen
pd.read_csv(),
Sie dasencoding
Attribut in die geöffnete Datei einfügen, nicht inread_csv
. Im Nachhinein offensichtlich, aber ein subtiler Fehler beim Aufspüren.quelle
Diese Antwort scheint das Allheilmittel für CSV-Codierungsprobleme zu sein. Wenn Sie ein seltsames Codierungsproblem mit Ihrem Header wie folgt haben:
Dann haben Sie am Anfang Ihrer CSV-Datei ein Stücklistenzeichen (Byte Order Mark). Diese Antwort behebt das Problem:
Python liest csv - Stückliste, die in den ersten Schlüssel eingebettet ist
Die Lösung besteht darin, die CSV zu laden mit
encoding="utf-8-sig"
:Hoffentlich hilft das jemandem.
quelle
Ich poste ein Update für diesen alten Thread. Ich habe eine Lösung gefunden, die funktioniert, aber das Öffnen jeder Datei erfordert. Ich habe meine CSV-Datei in LibreOffice geöffnet und Speichern unter> Filtereinstellungen bearbeiten gewählt. Im Dropdown-Menü habe ich die UTF8-Codierung ausgewählt. Dann habe ich
encoding="utf-8-sig"
auf diedata = pd.read_csv(r'C:\fullpathtofile\filename.csv', sep = ',', encoding="utf-8-sig")
.Hoffe das hilft jemandem.
quelle
Ich habe Probleme beim Öffnen einer CSV-Datei in vereinfachtem Chinesisch, die von einer Online-Bank heruntergeladen wurde. Ich habe es versucht
latin1
, ich habe es versuchtiso-8859-1
, ich habe es versuchtcp1252
, alles ohne Erfolg.Aber macht
pd.read_csv("",encoding ='gbk')
einfach die Arbeit.quelle
Bitte versuchen Sie hinzuzufügen
Das wird helfen. Hat für mich gearbeitet. Stellen Sie außerdem sicher, dass Sie die richtigen Trennzeichen und Spaltennamen verwenden.
Sie können mit dem Laden von nur 1000 Zeilen beginnen, um die Datei schnell zu laden.
quelle
Ich benutze Jupyter-Notebook. In meinem Fall wurde die Datei im falschen Format angezeigt. Die Option "Codierung" funktionierte nicht. Also speichere ich die CSV im Utf-8-Format und es funktioniert.
quelle
Versuche dies:
Es sieht so aus, als würde es sich um die Codierung kümmern, ohne sie explizit durch Argumente auszudrücken
quelle
Überprüfen Sie die Kodierung, bevor Sie zu Pandas übergehen. Es wird dich verlangsamen, aber ...
In Python 3.7
quelle
Ein weiteres wichtiges Problem, mit dem ich konfrontiert war und das zu demselben Fehler führte, war:
quelle
read_excel
in Pandas haben.