erreur UnicodeDecodeError: le codec 'utf-8' ne peut pas décoder l'octet 0xff en position 0: octet de départ invalide


164

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

Une erreur s'est produite lors de la compilation de "process.py" sur le site ci-dessus.

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

Traceback (dernier appel le plus récent):

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

Quelle est la cause de l'erreur? La version de Python est 3.5.2.

Réponses:


196

Python essaie de convertir un tableau d'octets ( bytesqu'il suppose être une chaîne encodée en utf-8) en une chaîne unicode ( str). Ce processus est bien sûr un décodage selon les règles utf-8. Lorsqu'il essaie cela, il rencontre une séquence d'octets qui n'est pas autorisée dans les chaînes encodées en utf-8 (à savoir ce 0xff à la position 0).

Puisque vous n'avez fourni aucun code que nous pourrions examiner, nous n'avons pu que deviner le reste.

A partir de la trace de pile, nous pouvons supposer que l'action de déclenchement était la lecture d'un fichier ( contents = open(path).read()). Je propose de recoder ceci d'une manière comme celle-ci:

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

Que bdans le spécificateur de mode dans les open()états que le fichier doit être traité comme binaire, il contentsrestera donc un bytes. Aucune tentative de décodage ne se produira de cette façon.


J'obtiens l'erreur "ValueError: la chaîne de mode doit commencer par l'un des éléments" r "," w "," a "ou" U ", pas" br ""
Unnikrishnan

3
@Unnikrishnan Ok, alors utilisez rb(je pensais que l'ordre n'avait aucune importance, mais cela semble l'être, au moins dans certains systèmes / versions). J'ai changé ma réponse en conséquence.
Alfe

58
byte 0xff in position 0pourrait également signifier que le fichier est encodé en UTF-16, alors vous pouvez le faire à la with open(path, encoding='utf-16') as f:place
Nikolai R Kristiansen

Et s'il n'y a en fait aucun 0xffpersonnage en position 0? Et c'est UTF-8encodé.
Iulian Onofrei

Un '\xFF'caractère pur sera encodé en UTF-8 comme '\xC3\xBF'. UTF-8 encode tous les caractères avec un ensemble MSB utilisant deux caractères. (Voir la sortie de printf "\xff" | iconv -f latin1 -t utf-8 | xxddans un shell.) Un verbatim '\xFF'au début d'une chaîne encodée en UTF-8 est une erreur de codage (pourrait être appelée une erreur de syntaxe en termes d'UTF-8).
Alfe

83

Utilisez cette solution pour supprimer (ignorer) les caractères et renvoyer la chaîne sans eux. N'utilisez ceci que si votre besoin est de les dépouiller et non de les convertir.

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

Utilisation errors='ignore' Vous perdrez juste quelques personnages. mais si vous ne vous souciez pas d'eux car ils semblent être des caractères supplémentaires provenant du mauvais formatage et de la programmation des clients se connectant à mon serveur socket. Ensuite, c'est une solution directe facile. référence


6
Fonctionne également pour decode (): contents = contents.decode('utf-8', 'ignore')Source: docs.python.org/3/howto/unicode.html#the-string-type
naaman

2
Devrait être la meilleure réponse
Statham

meilleure solution dans mon cas d'utilisation :)
maestromusica

Lorsque vous dites "perdre quelques caractères", vous voulez dire que le fichier contenant des erreurs ne sera pas lu? ou que tout le contenu de ce fichier ne sera pas lu?
msoutopico

@msoutopico Comme il ignore les erreurs, certains encodages ne seront pas lus, ce qui cause des problèmes. Mais je n'ai jamais rencontré de contenu qui a été ignoré lors de la lecture. Donc, fondamentalement, les problèmes d'écodage sont ignorés.
Nitish Kumar Pal

23

Eu un problème similaire à celui-ci, j'ai fini par utiliser UTF-16 pour décoder. mon code est ci-dessous.

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

cela prendrait le contenu du fichier comme une importation, mais cela renverrait le code au format UTF. à partir de là, il serait décodé et séparé par des lignes.


10
Dans Python 3, vous pouvez simplifier cela en utilisant le paramètre d'encodagewith open(path, encoding='utf-16') as f
Nikolai R Kristiansen

@NikolaiRKristiansen J'ai essayé d'utiliser votre méthode, mais j'ai obtenu une erreur comme TypeError: an integer is required (got type str). Pourquoi? Les deux fichiers sont binaires et lus comme rb.
Bogota le

1
@Bogota Le paramètre encodingn'a de sens que lors de la lecture de texte. Supprimez le 'b' de l'argument mode et réessayez. Pour en savoir plus, consultez
Nikolai R Kristiansen

19

Utilisez le format d'encodage ISO-8859-1 pour résoudre le problème.


1
Enfin atterri sur cela après avoir essayé plus de 10 autres encodages!
Rexcirus

15

Je suis tombé sur ce fil lorsque je souffre de la même erreur, après avoir fait des recherches, je peux le confirmer, c'est une erreur qui se produit lorsque vous essayez de décoder un fichier UTF-16 avec UTF-8.

Avec UTF-16, le premier caractère (2 octets en UTF-16) est une marque d'ordre d'octet (BOM) , qui est utilisée comme indice de décodage et n'apparaît pas comme un caractère dans la chaîne décodée. Cela signifie que le premier octet sera FE ou FF et le second, l'autre.

Fortement édité après avoir trouvé la vraie réponse


Cela a mis fin à 2 heures de mal de tête! Ouvrir le fichier avec open ('filename', 'r') comme f: puis imprimer son contenu montre UTF-8, ce qui est faux.
nulldroid

4

utiliser seulement

base64.b64decode(a) 

au lieu de

base64.b64decode(a).decode('utf-8')

2
son fonctionnement mais juste pour comprendre pouvez-vous expliquer pourquoi s'il vous plaît? :)
Ido Bleicher

3

Si vous êtes sur un mac, vérifiez si vous avez un fichier caché, .DS_Store. Après avoir supprimé le fichier, mon programme a fonctionné.


1

Vérifiez le chemin du fichier à lire. Mon code a continué à me donner des erreurs jusqu'à ce que je change le nom du chemin pour présenter le répertoire de travail. L'erreur était:

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

1

si vous recevez des données d'un port série, assurez-vous que vous utilisez le bon débit en bauds (et les autres configurations): le décodage avec ( utf-8 ) mais la mauvaise configuration générera la même erreur

UnicodeDecodeError: le codec 'utf-8' ne peut pas décoder l'octet 0xff en position 0: octet de départ invalide

pour vérifier la configuration de votre port série sous Linux, utilisez: stty -F /dev/ttyUSBX -a


1

Cela signifie simplement que l'on a choisi le mauvais encodage pour lire le fichier.

Sur Mac, utilisez file -I file.txtpour trouver le bon encodage. Sous Linux, utilisez file -i file.txt.


0

J'ai le même problème lors du traitement d'un fichier généré à partir de Linux. Il s'avère qu'il s'agissait de fichiers contenant des points d'interrogation.


-1

J'avais un problème similaire.

Résolu par:

import io

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

Cependant, j'ai eu un autre problème. Certains fichiers html (dans mon cas) n'étaient pas utf-8, j'ai donc reçu une erreur similaire. Lorsque j'ai exclu ces fichiers html, tout fonctionnait sans problème.

Donc, à l'exception de la correction du code, vérifiez également les fichiers que vous lisez, peut-être qu'il y a effectivement une incompatibilité.


-5

Si possible, ouvrez le fichier dans un éditeur de texte et essayez de changer le codage en UTF-8. Sinon, faites-le par programme au niveau du système d'exploitation.


-5

J'ai le même problème. J'essaie d'exécuter un exemple dans tensorflow / models / objective_detection et j'ai rencontré le même message. Essayez de changer Python3 en Python2

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.