“for line in…” ergibt UnicodeDecodeError: ‘utf-8’ codec can’t decode byte

Lesezeit: 4 Minuten

Benutzer-Avatar
SujitS

Hier ist mein Code,

for line in open('u.item'):
# Read each line

Immer wenn ich diesen Code ausführe, gibt es den folgenden Fehler:

UnicodeDecodeError: ‘utf-8’-Codec kann Byte 0xe9 an Position 2892 nicht decodieren: ungültiges Fortsetzungsbyte

Ich habe versucht, dies zu lösen und einen zusätzlichen Parameter in open() hinzuzufügen. Der Code sieht so aus:

for line in open('u.item', encoding='utf-8'):
# Read each line

Aber es gibt wieder den gleichen Fehler. Was sollte ich dann tun?

  • Schlecht codierte Daten würde ich annehmen.

    – Andreas Jung

    31. Oktober 2013 um 5:57 Uhr

  • Oder einfach keine UTF-8-Daten.

    – Mark Tolonen

    31. Oktober 2013 um 6:07 Uhr

  • Mögliches Duplikat von Python 3 UnicodeDecodeError – Wie debugge ich UnicodeDecodeError?

    – Dreier

    17. Januar 2019 um 9:03 Uhr

  • Wir hatten diesen Fehler mit msgpack bei der Verwendung von Python 3 anstelle von Python 2.7. Für uns war die Vorgehensweise, mit Python 2.7 zu arbeiten.

    – Jesse W. Collins

    5. Juni 2019 um 15:43 Uhr

Benutzer-Avatar
SujitS

Wie von Mark Ransom vorgeschlagen, habe ich die richtige Codierung für dieses Problem gefunden. Die Kodierung war "ISO-8859-1"also ersetzen open("u.item", encoding="utf-8") mit open('u.item', encoding = "ISO-8859-1") wird das Problem lösen.

  • Explizit ist besser als implizit (PEP 20).

    – 0 _

    1. Juli 2016 um 5:46 Uhr

  • Der Trick ist, dass ISO-8859-1 oder Latin_1 8-Bit-Zeichensätze sind, daher hat jeder Müll einen gültigen Wert. Vielleicht nicht brauchbar, aber wenn man es ignorieren will!

    – Kjeld Flarup

    12. April 2018 um 8:53 Uhr

  • Ich hatte das gleiche Problem UnicodeDecodeError: ‘utf-8’ Codec kann Byte 0xd0 an Position 32 nicht decodieren: ungültiges Fortsetzungsbyte. Ich habe Python 3.6.5 verwendet, um aws cli zu installieren. Und als ich aws –version ausprobierte, schlug es mit diesem Fehler fehl. Also musste ich /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/configparser.py bearbeiten und den Code wie folgt ändern def read(self, filenames, encoding=”ISO-8859-1″):

    – Евгений Коптюбенко

    27. September 2018 um 14:18 Uhr


  • Gibt es eine automatische Möglichkeit, die Codierung zu erkennen?

    – JoseOrtiz3

    29. Januar 2019 um 23:20 Uhr

  • @OrangeSherbet Ich habe die Erkennung mit implementiert chardet. Hier ist der Einzeiler (nach import chardet): chardet.detect(open(in_file, 'rb').read())['encoding']. Weitere Informationen finden Sie in dieser Antwort: stackoverflow.com/a/3323810/615422

    – VertigoRay

    20. März 2019 um 13:34 Uhr


Benutzer-Avatar
Ryoji Kuwae Neto

Folgendes hat bei mir auch funktioniert. ISO 8859-1 wird viel sparen, vor allem bei der Verwendung von Spracherkennungs-APIs.

Beispiel:

file = open('../Resources/' + filename, 'r', encoding="ISO-8859-1")

  • Möglicherweise haben Sie Recht, dass das OP ISO 8859-1 liest, wie aus dem 0xe9 (é) in der Fehlermeldung hervorgeht, aber Sie sollten erklären, warum Ihre Lösung funktioniert. Der Verweis auf Spracherkennungs-APIs hilft nicht weiter.

    – RolfBly

    26. Oktober 2017 um 20:26 Uhr

Benutzer-Avatar
Mark Lösegeld

Ihre Datei enthält eigentlich keine UTF-8-codierten Daten; es enthält eine andere Codierung. Finden Sie heraus, was diese Codierung ist, und verwenden Sie sie in der open Anruf.

Im Windows-1252 Kodierung, zum Beispiel die 0xe9 wäre der Charakter é.

  • Wie kann ich also herausfinden, um welche Codierung es sich handelt? Ich verwende Linux

    – SujitS

    31. Oktober 2013 um 11:35 Uhr

  • Es gibt keine Möglichkeit, das immer zu tun, aber sehen Sie sich die Antwort auf diese Frage an: stackoverflow.com/questions/436220/…

    – Remco Gerlich

    31. Oktober 2013 um 12:37 Uhr

Benutzer-Avatar
Shashank

Versuchen Sie, dies zu lesen, indem Sie es verwenden Pandas:

pd.read_csv('u.item', sep='|', names=m_cols, encoding='latin-1')

Benutzer-Avatar
Ayesha Siddiqa

Das funktioniert:

open('filename', encoding='latin-1')

Oder:

open('filename', encoding="ISO-8859-1")

  • Kommt drauf an, was man unter “funktioniert” versteht. Wenn Sie meinen, dass Ausnahmen vermieden werden, ist dies wahr, da dies die einzige Codierung ist, die keine ungültigen Bytes oder Sequenzen enthält. Das bedeutet jedoch nicht, dass Sie die richtigen Charaktere erhalten.

    – Markieren Sie Lösegeld

    9. März 2021 um 15:51 Uhr

Benutzer-Avatar
Peter Mortensen

Wenn Sie Python 2 verwenden, ist Folgendes die Lösung:

import io
for line in io.open("u.item", encoding="ISO-8859-1"):
    # Do something

Weil die encoding Parameter funktioniert nicht mit open()erhalten Sie die folgende Fehlermeldung:

TypeError: „encoding“ ist ein ungültiges Schlüsselwortargument für diese Funktion

  • Kommt drauf an, was man unter “funktioniert” versteht. Wenn Sie meinen, dass Ausnahmen vermieden werden, ist dies wahr, da dies die einzige Codierung ist, die keine ungültigen Bytes oder Sequenzen enthält. Das bedeutet jedoch nicht, dass Sie die richtigen Charaktere erhalten.

    – Markieren Sie Lösegeld

    9. März 2021 um 15:51 Uhr

Benutzer-Avatar
Peter Mortensen

Du könntest das Problem lösen mit:

for line in open(your_file_path, 'rb'):

‘rb’ liest die Datei im Binärmodus. Weiterlesen hier.

1084760cookie-check“for line in…” ergibt UnicodeDecodeError: ‘utf-8’ codec can’t decode byte

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy