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.

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.


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


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.


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.


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


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


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.


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

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


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.


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.


-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.


-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.


-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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.