UnicodeDecodeError beim Lesen von CSV-Dateien in Pandas mit Python

Ich führe ein Programm aus, das 30.000 ähnliche Dateien verarbeitet. Eine zufällige Anzahl von ihnen stoppt und produziert 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 kommt alle vom selben Ort. Was ist der beste Weg, dies zu korrigieren, um mit dem Import fortzufahren?

read_csv eine encoding , um mit Dateien in verschiedenen Formaten umzugehen. Ich verwende meistens 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 den Alias 'latin1' anstelle von 'ISO-8859-1' .

Sehen Sie sich die entsprechende Pandas-Dokumentation , Python-Docs-Beispiele zu CSV-Dateien und viele verwandte Fragen zu SO an.

Einfachste aller Lösungen:

  • Öffnen Sie die CSV-Datei im Sublime-Texteditor .
  • Speichern Sie die Datei im UTF-8-Format.

In erhabenen, klicken Sie auf Datei -> Speichern mit Codierung -> 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 erhabenen Schritt überspringen.

Lies einfach die Datei mit

 data = pd.read_csv('file_name.csv', encoding='utf-8') 

und die anderen verschiedenen Kodierungstypen sind:

 encoding = "cp1252" encoding = "ISO-8859-1" 

Ich war eine Weile damit beschäftigt und dachte, ich würde diese Frage posten, da es das erste Suchergebnis ist. Das Hinzufügen des Tags “encoding = ‘iso-8859-1” zu pandas read_csv funktionierte nicht, und auch keine andere Kodierung führte weiterhin einen UnicodeDecodeError.

Wenn Sie ein Datei-Handle an pd.read_csv () übergeben, müssen Sie das Attribut encoding = für die Datei öffnen, nicht für read_csv. Im Nachhinein offensichtlich, aber ein subtiler Fehler aufzuspüren.

Pandas ermöglicht die Angabe der Kodierung, erlaubt jedoch nicht, Fehler zu ignorieren, die die errorshaften Bytes nicht automatisch ersetzen. Es gibt also keine Einheitsgröße für alle Methoden, sondern unterschiedliche Arten, die vom tatsächlichen Anwendungsfall abhängen.

  1. Sie kennen die Kodierung und es gibt keinen Kodierungserrors in der Datei. 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) 
  2. Sie wollen nicht mit Codierungsfragen belästigt werden und wollen 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 in das Unicode-Zeichen desselben Codes konvertiert):

     pd.read_csv(input_file_and_path, ..., encoding='latin1') 
  3. Sie wissen, dass der Großteil der Datei mit einer bestimmten Kodierung geschrieben ist, aber auch Kodierungserrors 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 Kodierung enthält. Pandas hat keine Vorkehrungen für eine spezielle Fehlerverarbeitung, aber die Python-Öffnungsfunktion hat (angenommen Python3) und read_csv akzeptiert ein dateiähnliches Objekt. Typische Fehlerparameter, die hier verwendet werden 'ignore' sind 'ignore' was nur die errorshaften Bytes unterdrückt oder (IMHO besser) 'backslashreplace' welches die störenden Bytes durch die Backslashed-Escape-Sequenz von Python 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, ...)