686 Stimmen

UnicodeDecodeError beim Lesen einer CSV-Datei in Pandas

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 stammt alle vom gleichen Ort. Wie kann ich dies am besten korrigieren, um mit dem Import fortzufahren?

6voto

Victor Villacorta Punkte 461

In meinem Fall hat das für Python 2.7 funktioniert:

data = read_csv(filename, encoding = "ISO-8859-1", dtype={'name_of_colum': unicode}, low_memory=False) 

Und nur für Python 3:

data = read_csv(filename, encoding = "ISO-8859-1", low_memory=False)

5voto

J. Ternent Punkte 116

Ich habe eine Weile damit gekämpft und dachte, ich würde auf diese Frage antworten, da sie das erste Suchergebnis ist. Das Hinzufügen des encoding="iso-8859-1"-Tags zu read_csv von pandas hat nicht funktioniert, ebenso wenig wie jedes andere Encoding, es hat immer einen UnicodeDecodeError angezeigt.

Wenn Sie pd.read_csv() einen Dateihandle übergeben, müssen Sie das encoding-Attribut beim Öffnen der Datei setzen, nicht bei read_csv. Rückblickend offensichtlich, aber ein subtiler Fehler, den es zu verfolgen gilt.

4voto

Jon Punkte 1967

Ich poste eine Antwort, um eine aktualisierte Lösung und Erklärung dafür zu geben, warum dieses Problem auftreten kann. Angenommen, Sie erhalten diese Daten aus einer Datenbank oder Excel-Arbeitsmappe. Wenn Sie Sonderzeichen wie La Cañada Flintridge city haben, außer Sie exportieren die Daten mit der UTF-8-Codierung, werden Fehler auftreten. La Cañada Flintridge city wird zu La Ca\xf1ada Flintridge city. Wenn Sie pandas.read_csv ohne Anpassungen an den Standardparametern verwenden, erhalten Sie den folgenden Fehler

UnicodeDecodeError: 'utf-8' codec can't decode byte 0xf1 in position 5: invalid continuation byte

Glücklicherweise gibt es einige Lösungen.

Option 1, beheben Sie das Problem beim Exportieren. Achten Sie darauf, die UTF-8-Codierung zu verwenden.

Option 2, wenn das Beheben des Exportproblems für Sie nicht verfügbar ist und Sie pandas.read_csv verwenden müssen, stellen Sie sicher, dass Sie die folgenden Parameter einschließen, engine='python'. Standardmäßig verwendet pandas engine='C', was großartig ist, um große saubere Dateien zu lesen, aber abstürzt, wenn etwas Unerwartetes passiert. Meiner Erfahrung nach hat das Festlegen von encoding='utf-8' diesen UnicodeDecodeError niemals behoben. Außerdem müssen Sie errors_bad_lines nicht verwenden, aber das ist immer noch eine Option, wenn Sie es wirklich benötigen.

pd.read_csv(, engine='python')

Option 3: Lösung ist meine bevorzugte Lösung persönlich. Lesen Sie die Datei mit reinem Python.

import pandas as pd

data = []

with open(, "rb") as myfile:
    # lesen Sie den Header separat ein
    # dekodieren Sie ihn als 'utf-8', entfernen Sie Sonderzeichen und teilen Sie ihn am Komma (oder Trennzeichen)
    header = myfile.readline().decode('utf-8').replace('\r\n', '').split(',')
    # lesen Sie den Rest der Daten ein
    for line in myfile:
        row = line.decode('utf-8', errors='ignore').replace('\r\n', '').split(',')
        data.append(row)

# speichern Sie die Daten als DataFrame
df = pd.DataFrame(data=data, columns = header)

Hoffentlich hilft dies Personen, die dieses Problem zum ersten Mal haben.

4voto

Dileep Dominic Punkte 479

Sie können dies ausprobieren.

import csv
import pandas as pd
df = pd.read_csv(filepath,encoding='unicode_escape')

4voto

Mujeeb Ishaque Punkte 1480

Ein weiteres wichtiges Problem, das ich hatte und das zum selben Fehler führte, war:

_values = pd.read_csv("C:\Users\Mujeeb\Desktop\file.xlxs")

^Diese Zeile führte zum selben Fehler, weil ich versuche, eine Excel-Datei mit der Methode read_csv() zu lesen. Verwenden Sie read_excel() für das Lesen von .xlxs-Dateien

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X