Fehler UnicodeDecodeError: Der Codec 'utf-8' kann das Byte 0xff an Position 0 nicht dekodieren: Ungültiges Startbyte

162

https://github.com/affinelayer/pix2pix-tensorflow/tree/master/tools

Beim Kompilieren von "process.py" auf der obigen Site ist ein Fehler aufgetreten.

 python tools/process.py --input_dir data --            operation resize --outp
ut_dir data2/resize
data/0.jpg -> data2/resize/0.png

Traceback (letzter Anruf zuletzt):

File "tools/process.py", line 235, in <module>
  main()
File "tools/process.py", line 167, in main
  src = load(src_path)
File "tools/process.py", line 113, in load
  contents = open(path).read()
      File"/home/user/anaconda3/envs/tensorflow_2/lib/python3.5/codecs.py", line 321, in decode
  (result, consumed) = self._buffer_decode(data, self.errors, final)
UnicodeDecodeError: 'utf-8' codec can't decode     byte 0xff in position 0: invalid start byte

Was ist die Ursache des Fehlers? Pythons Version ist 3.5.2.

Kuchen
quelle

Antworten:

194

Python versucht, ein Byte-Array (von bytesdem angenommen wird, dass es sich um eine utf-8-codierte Zeichenfolge handelt) in eine Unicode-Zeichenfolge (str ) . Dieser Prozess ist natürlich eine Dekodierung nach utf-8-Regeln. Wenn es dies versucht, trifft es auf eine Byte-Sequenz, die in utf-8-codierten Zeichenfolgen nicht zulässig ist (nämlich dieses 0xff an Position 0).

Da Sie keinen Code angegeben haben, den wir uns ansehen konnten, konnten wir nur den Rest erraten.

Aus dem Stack-Trace können wir annehmen, dass die auslösende Aktion das Lesen aus einer Datei ( contents = open(path).read()) war. Ich schlage vor, dies auf folgende Weise neu zu kodieren:

with open(path, 'rb') as f:
  contents = f.read()

Das bim Modusbezeichner in den open()Zuständen, dass die Datei als binär behandelt werden soll, contentsbleibt also a bytes. Auf diese Weise wird kein Dekodierungsversuch durchgeführt.

Alfe
quelle
Ich erhalte die Fehlermeldung "ValueError: Moduszeichenfolge muss mit einem von 'r', 'w', 'a' oder 'U' beginnen, nicht mit 'br'"
Unnikrishnan
3
@Unnikrishnan Ok, dann benutze rb(ich dachte, Reihenfolge sei nicht wichtig, aber es scheint zumindest in einigen Systemen / Versionen zu sein). Ich habe meine Antwort entsprechend geändert.
Alfe
57
byte 0xff in position 0könnte auch bedeuten, dass die Datei in UTF-16 codiert ist, dann können Sie with open(path, encoding='utf-16') as f:stattdessen
Nikolai R Kristiansen
Was ist, wenn sich tatsächlich kein 0xffCharakter an der Position befindet 0? Und es ist UTF-8verschlüsselt.
Iulian Onofrei
Ein reines '\xFF'Zeichen wird in UTF-8 als codiert '\xC3\xBF'. UTF-8 codiert alle Zeichen mit einem festgelegten MSB mit zwei Zeichen. (Siehe die Ausgabe von printf "\xff" | iconv -f latin1 -t utf-8 | xxdin einer Shell.) Ein Wortlaut '\xFF'am Anfang einer UTF-8-codierten Zeichenfolge ist ein Codierungsfehler (könnte in Bezug auf UTF-8 als Syntaxfehler bezeichnet werden).
Alfe
83

Verwenden Sie diese Lösung, um die Zeichen zu entfernen (zu ignorieren) und die Zeichenfolge ohne sie zurückzugeben. Verwenden Sie diese Option nur, wenn Sie sie entfernen und nicht konvertieren möchten.

with open(path, encoding="utf8", errors='ignore') as f:

Verwenden errors='ignore' Sie verlieren nur einige Zeichen. Aber wenn Sie sich nicht für sie interessieren, da es sich anscheinend um zusätzliche Zeichen handelt, die auf eine schlechte Formatierung und Programmierung der Clients zurückzuführen sind, die eine Verbindung zu meinem Socket-Server herstellen. Dann ist es eine einfache direkte Lösung. Referenz

Nitish Kumar Pal
quelle
6
Funktioniert auch für decode (): contents = contents.decode('utf-8', 'ignore')Quelle: docs.python.org/3/howto/unicode.html#the-string-type
naaman
2
Sollte die beste Antwort sein
Statham
beste Lösung in meinem Anwendungsfall :)
Maestromusica
Wenn Sie "einige Zeichen verlieren" sagen, meinen Sie damit, dass die fehlerhafte Datei nicht gelesen wird? oder dass nicht der gesamte Inhalt dieser Datei gelesen wird?
Msoutopico
@msoutopico Da die Fehler ignoriert werden, werden einige Codierungen nicht gelesen, die Probleme verursachen. Aber ich bin noch nie auf Inhalte gestoßen, die beim Lesen übersprungen wurden. Grundsätzlich werden Ökodierungsprobleme ignoriert.
Nitish Kumar Pal
23

Hatte ein ähnliches Problem, endete mit UTF-16 zum Dekodieren. Mein Code ist unten.

with open(path_to_file,'rb') as f:
    contents = f.read()
contents = contents.rstrip("\n").decode("utf-16")
contents = contents.split("\r\n")

Dies würde den Dateiinhalt als Import nehmen, aber den Code im UTF-Format zurückgeben. von dort würde es entschlüsselt und durch Linien getrennt werden.

tattmoney76
quelle
10
In Python 3 können Sie dies vereinfachen, indem Sie den Codierungsparameterwith open(path, encoding='utf-16') as f
Nikolai R Kristiansen
@NikolaiRKristiansen Ich habe versucht, Ihre Methode zu verwenden, habe aber einen Fehler als erhalten TypeError: an integer is required (got type str). Warum? Beide Dateien sind binär und werden als gelesen rb.
Bogota
1
@Bogota Der encodingParameter ist nur beim Lesen von Text sinnvoll. Löschen Sie das 'b' aus dem Modusargument und versuchen Sie es erneut. Lesen Sie mehr in den Dokumenten: docs.python.org/3/library/functions.html#open
Nikolai R Kristiansen
19

Verwenden Sie das Codierungsformat ISO-8859-1 , um das Problem zu beheben.

Ramineni Ravi Teja
quelle
1
Endlich darauf gelandet, nachdem ich mehr als 10 andere Codierungen ausprobiert habe!
Rexcirus
15

Ich bin auf diesen Thread gestoßen, als ich denselben Fehler hatte. Nach einigen Recherchen kann ich bestätigen, dass dies ein Fehler ist, der auftritt, wenn Sie versuchen, eine UTF-16-Datei mit UTF-8 zu dekodieren.

Bei UTF-16 ist das erste Zeichen (2 Byte in UTF-16) ein Byte Order Mark (BOM) , das als Dekodierungshinweis verwendet wird und nicht als Zeichen in der dekodierten Zeichenfolge angezeigt wird. Dies bedeutet, dass das erste Byte entweder FE oder FF und das zweite das andere Byte ist.

Stark bearbeitet, nachdem ich die richtige Antwort herausgefunden hatte

Peter Ogden
quelle
Dies endete 2 Stunden Kopfschmerzen! Wenn Sie die Datei mit open ('Dateiname', 'r') als f: öffnen und dann ihren Inhalt drucken, wird UTF-8 angezeigt, was falsch ist.
Nulldroid
4

nur benutzen

base64.b64decode(a) 

anstatt

base64.b64decode(a).decode('utf-8')
pradeep karunathilaka
quelle
2
Es funktioniert, aber nur um zu verstehen, können Sie erklären, warum bitte? :)
Ido Bleicher
3

Wenn Sie auf einem Mac arbeiten, überprüfen Sie, ob Sie nach einer versteckten Datei suchen .DS_Store. Nach dem Entfernen der Datei funktionierte mein Programm.

Juan Navarrete
quelle
1

Überprüfen Sie den Pfad der zu lesenden Datei. Mein Code gab mir weiterhin Fehler, bis ich den Pfadnamen in das aktuelle Arbeitsverzeichnis änderte. Der Fehler war:

newchars, decodedbytes = self.decode(data, self.errors)
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xff in position 0: invalid start byte
Rex131xO
quelle
1

Wenn Sie Daten von einer seriellen Schnittstelle empfangen, stellen Sie sicher, dass Sie die richtige Baudrate (und die anderen Konfigurationen) verwenden: Die Dekodierung mit ( utf-8 ), aber die falsche Konfiguration erzeugt denselben Fehler

UnicodeDecodeError: Der Codec 'utf-8' kann das Byte 0xff an Position 0 nicht dekodieren: Ungültiges Startbyte

So überprüfen Sie Ihre Konfiguration der seriellen Schnittstelle unter Linux: stty -F /dev/ttyUSBX -a

Saif Faidi
quelle
1

Es bedeutet einfach, dass man die falsche Codierung gewählt hat, um die Datei zu lesen.

Verwenden Sie file -I file.txtauf dem Mac, um die richtige Codierung zu finden. Verwenden Sie unter Linux file -i file.txt.

Minh Triet
quelle
0

Ich habe das gleiche Problem bei der Verarbeitung einer von Linux generierten Datei. Es stellte sich heraus, dass es sich um Dateien handelte, die Fragezeichen enthielten.

Wim Folkerts
quelle
-1

Ich hatte ein ähnliches Problem.

Gelöst von:

import io

with io.open(filename, 'r', encoding='utf-8') as fn:
  lines = fn.readlines()

Ich hatte jedoch ein anderes Problem. Einige HTML-Dateien (in meinem Fall) waren nicht utf-8, daher habe ich einen ähnlichen Fehler erhalten. Als ich diese HTML-Dateien ausgeschlossen habe, hat alles reibungslos funktioniert.

Überprüfen Sie also, abgesehen vom Korrigieren des Codes, auch die Dateien, aus denen Sie lesen. Möglicherweise liegt tatsächlich eine Inkompatibilität vor.

Kostas Tsiligkiris
quelle
-4

Öffnen Sie die Datei nach Möglichkeit in einem Texteditor und versuchen Sie, die Codierung in UTF-8 zu ändern. Andernfalls machen Sie es programmgesteuert auf Betriebssystemebene.

Manoj Joshi
quelle
-4

Ich habe ein ähnliches Problem. Ich versuche ein Beispiel in tensorflow / models / objectivdetection auszuführen und habe dieselbe Nachricht erhalten. Versuchen Sie, Python3 in Python2 zu ändern

user8665083
quelle