it-swarm.com.de

UnicodeDecodeError beim Lesen einer CSV-Datei in Pandas mit Python

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?

214
TravisVOX

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. 

499
Stefan

Die einfachste aller Lösungen:

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

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"
20
Gil Baggio

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.

  1. 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)
    
  2. 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')
    
  3. 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, ...)
    
6
Serge Ballesta
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

2
bhavesh

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.

1
J. Ternent

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) 
1

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.

1
nbwoodward

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.

0
Himanshu Sharma

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')
0
Jan33

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.

0
tshirtdr1

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.