384 votes

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

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.

397voto

Alfe Points 12023

Python essaie de convertir un tableau d'octets (un bytes il assume d'être codé en utf-8 chaîne de caractères) à une chaîne unicode (str). Ce processus, bien sûr, est de décodage selon l'utf-8 règles. Quand il essaie ceci, il rencontre une séquence d'octets qui n'est pas autorisé dans codé en utf-8 chaînes (à savoir ce 0xff à la position 0).

Puisque vous n'avez pas à fournir tout le code que nous puissions regarder, seulement, nous avons pu deviner que sur le reste.

À partir de la trace de la pile, on peut supposer que l'action de déclenchement a été la lecture à partir d'un fichier (contents = open(path).read()). Je propose de recoder cette dans un mode comme ceci:

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

Qu' b dans le mode spécificateur de l' open() indique que le fichier doit être traitée comme binaire, de sorte contents restera un bytes. Aucune tentative de décodage va se passer de cette façon.

181voto

Nitish Kumar Pal Points 586

Utiliser cette solution, il va sortir la bande (ignorer) les personnages et le retour de la chaîne sans eux. Seulement utiliser cette option si votre besoin est de les dépouiller de ne pas les convertir.

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

À l'aide de errors='ignore' Vous allez juste perdre de certains personnages. mais si vous n'avez pas de soins sur eux comme ils semblent l'être des personnages supplémentaires provenant de la mauvaise mise en forme et de la programmation de la les clients de la connexion à mon serveur socket. Ensuite ses un facile solution directe. référence

37voto

tattmoney76 Points 131

Avait un problème similaire à celui-ci, a 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 le code serait renvoyé au format UTF. de là, il serait décodé et séparé par des lignes.

26voto

Peter Ogden Points 314

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

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

Fortement modifiées après j'ai découvert la vraie réponse

9voto

utiliser seulement

 base64.b64decode(a) 
 

au lieu de

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X