2016-12-21 2 views
0

ich eine CSV-Datei, die ichUnicodeDecodeError: 'utf8' Codec kann Byte nicht dekodieren 0xEA

Die API sieht wie folgt über ein HTML-Formular an eine Python-API Upload:

@app.route('/add_candidates_to_db', methods=['GET','POST']) 
def add_candidates(): 
    file = request.files['csv_file'] 
    x = io.StringIO(file.read().decode('UTF8'), newline=None) 
    csv_input = csv.reader(x) 
    for row in csv_input: 
     print(row) 

Ich habe den Teil der Datei gefunden, der das Problem verursacht. In meiner Datei hat es Í Zeichen.

ich diesen Fehler: UnicodeDecodeError: 'utf8' codec can't decode byte 0xea in position 1317: invalid continuation byte

ich dachte ich, es war Decodierung mit .decode('UTF8') oder ist der Fehler vor, dass geschieht mit file.read()?

Wie behebe ich das?

** **

Edit: ich die Kontrolle über die Datei haben. Ich erstelle die CSV-Datei selbst, indem ich Daten entwerfe (manchmal haben diese Daten seltsame Zeichen).

Auf der Serverseite lese ich jede Zeile in der Datei und füge sie in eine Datenbank ein.

+2

Es sagt Ihnen, es ist ungültig utf8. Um es zu beheben, verwenden Sie gültige utf8. – pvg

+0

Ahh, es heißt, ich kann es nicht in utf8 entschlüsseln, weil es kein gültiges utf8-Zeichen ist? –

+0

Rechts. Für Fragen wie diese ist das Posten der Version von Python auch nützlich. Das sieht aus wie Python 2. – pvg

Antwort

-1

Es scheint, dass Ihre Datei nicht in utf8 codiert ist. Sie können versuchen, die Datei mit all the encodings that Python understand zu lesen und zu überprüfen, wodurch Sie den gesamten Inhalt der Datei lesen können. Versuchen Sie dieses Skript:

from codecs import open 

encodings = [ 
    "ascii", 
    "big5", 
    "big5hkscs", 
    "cp037", 
    "cp424", 
    "cp437", 
    "cp500", 
    "cp720", 
    "cp737", 
    "cp775", 
    "cp850", 
    "cp852", 
    "cp855", 
    "cp856", 
    "cp857", 
    "cp858", 
    "cp860", 
    "cp861", 
    "cp862", 
    "cp863", 
    "cp864", 
    "cp865", 
    "cp866", 
    "cp869", 
    "cp874", 
    "cp875", 
    "cp932", 
    "cp949", 
    "cp950", 
    "cp1006", 
    "cp1026", 
    "cp1140", 
    "cp1250", 
    "cp1251", 
    "cp1252", 
    "cp1253", 
    "cp1254", 
    "cp1255", 
    "cp1256", 
    "cp1257", 
    "cp1258", 
    "euc_jp", 
    "euc_jis_2004", 
    "euc_jisx0213", 
    "euc_kr", 
    "gb2312", 
    "gbk", 
    "gb18030", 
    "hz", 
    "iso2022_jp", 
    "iso2022_jp_1", 
    "iso2022_jp_2", 
    "iso2022_jp_2004", 
    "iso2022_jp_3", 
    "iso2022_jp_ext", 
    "iso2022_kr", 
    "latin_1", 
    "iso8859_2", 
    "iso8859_3", 
    "iso8859_4", 
    "iso8859_5", 
    "iso8859_6", 
    "iso8859_7", 
    "iso8859_8", 
    "iso8859_9", 
    "iso8859_10", 
    "iso8859_13", 
    "iso8859_14", 
    "iso8859_15", 
    "iso8859_16", 
    "johab", 
    "koi8_r", 
    "koi8_u", 
    "mac_cyrillic", 
    "mac_greek", 
    "mac_iceland", 
    "mac_latin2", 
    "mac_roman", 
    "mac_turkish", 
    "ptcp154", 
    "shift_jis", 
    "shift_jis_2004", 
    "shift_jisx0213", 
    "utf_32", 
    "utf_32_be", 
    "utf_32_le", 
    "utf_16", 
    "utf_16_be", 
    "utf_16_le", 
    "utf_7", 
    "utf_8", 
    "utf_8_sig", 
] 

for encoding in encodings: 
    try: 
     with open(file, encoding=encoding) as f: 
      f.read() 
     print('Seemingly working encoding: {}'.format(encoding)) 
    except: 
     pass 

wo file ist wieder der Dateiname der Datei.

+0

Alle Single-Byte-Kodierungen (die ich glaube, enthält alle' CP * ' und 'iso8859 *' encodings) kann die Datei ohne Fehler lesen, aber der Benutzer muss immer noch die Ergebnisse überprüfen, um zu überprüfen, ob die Datei zu den richtigen Zeichen decodiert wurde. – jwodder

+0

Dies ist keine vernünftige Antwort. Es gibt bessere Möglichkeiten, die Codierungserkennung zu versuchen. – pvg

+0

Daher der Wortlaut "scheinbar funktioniert". Das Skript findet Codierungen, die keinen Fehler verursachen. Es wird nicht garantiert, dass eine bestimmte Kodierung den Job korrekt ausführt. –

1

Ihre Daten sind nicht UTF-8, sie enthält Fehler. Sie sagen, dass Sie die Daten generieren, also ist die ideale Lösung, bessere Daten zu generieren.

Leider sind wir manchmal nicht in der Lage, qualitativ hochwertige Daten zu erhalten, oder wir haben Server, die uns Müll liefern, und wir müssen es aussortieren. Für diese Situationen können wir beim Decodieren von Text eine weniger strenge Fehlerbehandlung verwenden.

Statt:

file.read().decode('UTF8') 

können Sie verwenden:

file.read().decode('UTF8', 'replace') 

Dadurch wird es so, dass alle „Müll“ Zeichen (alles, was nicht korrekt als UTF-8 codiert ist) erhalten mit U + FFFD ersetzt, die wie folgt aussieht:

Sie sagen, dass Ihre Datei diehatZeichen, aber Sie sehen wahrscheinlich die Datei mit einer anderen Codierung als UTF-8. Ist Ihre Datei angenommen zu enthalten Í oder ist es nur mojibake? Vielleicht können Sie herausfinden, was der Charakter sein soll, und daraus können Sie herausfinden, welche Kodierung Ihre Daten verwenden, wenn es nicht UTF-8 ist.

+0

Dies ist keine großartige Antwort, ohne zumindest darauf hinzuweisen, dass es Werkzeuge gibt, die versuchen, die Zeichencodierung zu bestimmen, und sie sind oft ziemlich effektiv. Wie es aussieht, ist Ihre Antwort im Grunde genommen "trash the data". Das ist nicht wirklich notwendig. – pvg

+0

@pvg: Das ist ein großer Beitrag. Bitte zögern Sie nicht den "Bearbeiten" Knopf zu drücken. –

Verwandte Themen