Ich verwende ein Programm, 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 stammen alle von derselben Stelle. Wie kann man dies am besten korrigieren, um mit dem Import fortfahren zu können?
read_csv
verwendet eine encoding
-Option, um Dateien in verschiedenen Formaten zu verarbeiten. Meist verwende ich read_csv('file', encoding = "ISO-8859-1")
oder alternativ encoding = "utf-8"
zum Lesen und generell utf-8
für to_csv
.
Sie können auch eine von mehreren alias
-Optionen wie 'latin'
anstelle von 'ISO-8859-1'
verwenden (siehe python docs , auch für zahlreiche andere Kodierungen, die Sie möglicherweise antreffen).
Siehe - relevante Pandas-Dokumentation , python docs - Beispiele zu csv-Dateien und viele verwandte Fragen zu SO.
Um die Kodierung zu erkennen (vorausgesetzt, die Datei enthält keine ASCII-Zeichen), können Sie enca
(siehe man page ) oder file -i
(linux) oder file -I
(osx) (siehe man page ) verwenden.
Die einfachste aller Lösungen:
Klicken Sie in sublime auf Datei -> Mit Kodierung speichern -> UTF-8
Dann können Sie Ihre Datei wie gewohnt lesen:
import pandas as pd
data = pd.read_csv('file_name.csv', encoding='utf-8')
EDIT 1:
Wenn es viele Dateien gibt, können Sie den sublime Schritt überspringen.
Lesen Sie einfach die Datei mit
data = pd.read_csv('file_name.csv', encoding='utf-8')
und die anderen verschiedenen Codierungsarten sind:
encoding = "cp1252"
encoding = "ISO-8859-1"
Pandas ermöglicht die Angabe der Codierung, nicht aber das Ignorieren von Fehlern, um die anstößigen Bytes nicht automatisch zu ersetzen. Es gibt also keine one size fits all method, aber unterschiedliche Möglichkeiten, abhängig vom tatsächlichen Anwendungsfall.
Sie kennen die Kodierung und die Datei enthält keinen Kodierungsfehler. Großartig: Sie müssen nur die Kodierung angeben:
file_encoding = 'cp1252' # set file_encoding to the file encoding (utf8, latin1, etc.)
pd.read_csv(input_file_and_path, ..., encoding=file_encoding)
Sie möchten sich nicht mit Fragen zum Kodieren beschäftigen und nur diese verdammte Datei laden, auch wenn einige Textfelder Müll enthalten. Ok, Sie müssen nur die Latin1
-Codierung verwenden, da jedes mögliche Byte als Eingabe akzeptiert wird (und in das Unicode-Zeichen desselben Codes umgewandelt wird):
pd.read_csv(input_file_and_path, ..., encoding='latin1')
Sie wissen, dass der Großteil der Datei mit einer bestimmten Kodierung geschrieben ist, sie enthält jedoch auch Kodierungsfehler. Ein reales Beispiel ist eine UTF8-Datei, die mit einem Nicht-Utf8-Editor bearbeitet wurde und einige Zeilen mit einer anderen Kodierung enthält. Pandas hat keine spezielle Fehlerverarbeitung, aber die Funktion Python open
hat (vorausgesetzt, Python3) und read_csv
akzeptiert ein dateiähnliches Objekt. Typische Fehlerparameter, die hier verwendet werden sollen, sind 'ignore'
, die nur die anstößigen Bytes unterdrücken, oder (IMHO besser) 'backslashreplace'
, der die anstößigen Bytes durch ihre umgekehrte Python-Escape-Sequenz ersetzt:
file_encoding = 'utf8' # set file_encoding to the file encoding (utf8, latin1, etc.)
input_fd = open(input_file_and_path, encoding=file_encoding, errors = 'backslashreplace')
pd.read_csv(input_fd, ...)
with open('filename.csv') as f:
print(f)
nachdem Sie diesen Code ausgeführt haben, finden Sie die Kodierung von 'Dateiname.csv'
data=pd.read_csv('filename.csv', encoding="encoding as you found earlier"
los gehts
Kämpfte eine Weile damit und dachte, ich würde zu dieser Frage posten, da dies das erste Suchergebnis ist. Das Hinzufügen des Tags "coding = 'iso-8859-1" zu pandas read_csv funktionierte nicht und auch keine andere Codierung lieferte einen UnicodeDecodeError.
Wenn Sie einen Datei-Handle an pd.read_csv () übergeben, müssen Sie das Attribut coding = in die Datei öffnen, nicht in read_csv. Im Nachhinein offensichtlich, aber ein subtiler Fehler.
In meinem Fall funktionierte dies für python 2.7:
data = read_csv(filename, encoding = "ISO-8859-1", dtype={'name_of_colum': unicode}, low_memory=False)
Und für python 3 nur:
data = read_csv(filename, encoding = "ISO-8859-1", low_memory=False)
Diese Antwort scheint der Haken für CSV-Codierungsprobleme zu sein. Wenn Sie mit Ihrer Kopfzeile ein seltsames Codierungsproblem wie folgt feststellen:
>>> f = open(filename,"r")
>>> reader = DictReader(f)
>>> next(reader)
OrderedDict([('\ufeffid', '1'), ... ])
Dann haben Sie am Anfang Ihrer CSV-Datei ein Byte Order Mark (BOM) Zeichen. Diese Antwort spricht das Problem an:
Python read csv - In den ersten Schlüssel eingebettete Stückliste
Die Lösung besteht darin, die CSV mit encoding="utf-8-sig"
zu laden:
>>> f = open(filename,"r", encoding="utf-8-sig")
>>> reader = DictReader(f)
>>> next(reader)
OrderedDict([('id', '1'), ... ])
Hoffentlich hilft das jemandem.
Ich benutze Jupyter-Notebook. In meinem Fall wurde die Datei im falschen Format angezeigt. Die Option 'Kodierung' hat nicht funktioniert. Also speichere ich die csv im utf-8 Format und es funktioniert.
Versuchen Sie, die Engine = 'python' anzugeben. Es hat für mich funktioniert, aber ich versuche immer noch herauszufinden warum.
df = pd.read_csv(input_file_path,...engine='python')
Ich poste ein Update zu diesem alten Thread. Ich habe eine Lösung gefunden, die funktioniert hat, aber jede Datei geöffnet werden muss. Ich habe meine CSV-Datei in LibreOffice geöffnet, und dann Speichern unter> Filtereinstellungen bearbeiten gewählt. Im Dropdown-Menü habe ich die UTF8-Codierung ausgewählt. Dann fügte ich encoding="utf-8-sig"
zur data = pd.read_csv(r'C:\fullpathtofile\filename.csv', sep = ',', encoding="utf-8-sig")
hinzu.
Hoffe das hilft jemandem.
In meinem Fall hat eine Datei die Codierung "USC-2 LE BOM" gemäß Notepad ++. Für Python ist das encoding = "utf_16_le".
Ich hoffe, es hilft, eine Antwort für jemanden etwas schneller zu finden.