web-dev-qa-db-fra.com

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 (appel le plus récent en dernier):

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.

102
pie

Python tente de convertir un tableau d'octets (un bytes qu'il considère comme une chaîne codé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 tente cela, il rencontre une séquence d'octets qui n'est pas autorisée dans les chaînes codées en utf-8 (à savoir, cette 0xff à la position 0).

Puisque vous n’avez fourni aucun code que nous puissions examiner, nous ne pouvons que deviner le reste.

À partir de la trace de la pile, on peut supposer que l’action déclencheuse était la lecture d’un fichier (contents = open(path).read()). Je propose de recoder ceci de la manière suivante:

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

Que b dans le spécificateur de mode de open() indique que le fichier doit être traité comme binaire, donc contents restera un bytes. Aucune tentative de décodage ne se produira de cette façon.

114
Alfe

Utilisez cette solution, elle supprimera (ignorera) les caractères et renverra la chaîne sans eux. Utilisez-le uniquement si votre besoin est de les dépouiller et non de les convertir.

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

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

47
Nitish Kumar Pal

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 renverrait le code au format UTF. de là, il serait décodé et séparé par des lignes.

16
tattmoney76

Je suis tombé sur ce fil alors que je rencontrais la même erreur. Après quelques recherches, je peux le confirmer. Il s’agit d’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) , utilisée comme indication de décodage et n'apparaissant pas en tant que caractère dans la chaîne décodée. . Cela signifie que le premier octet sera soit FE ou FF et le second, l’autre.

Fortement édité après avoir découvert la vraie réponse

11
Peter Ogden

Lire (r) le fichier CSV details.csv et encoder par tf8. si erreur se produit ignorer l'erreur, Ceci est simplement effectué par le code suivant.

with open('details.csv', 'r',encoding="utf8", errors='ignore') as csvDataFile:
    csvReader = csv.DictReader(csvDataFile)
7
Hariharan AR

utiliser seulement

base64.b64decode(a) 

au lieu de

base64.b64decode(a).decode('utf-8')
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é.

2
Juan Navarrete

Utilisez le format de codage ISO-8859-1 pour résoudre le problème.

1

Vérifiez le chemin du fichier à lire. Mon code continuait à me donner des erreurs jusqu'à ce que je change le nom du chemin en répertoire de travail actuel. 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
Rex131xO

HitHere, vous devez d'abord charger le fichier "GoogleNews-vectors-negative300.bin.gz", puis l'extraire à l'aide de cette commande dans Ubuntu: gunzip -k GoogleNews-vectors-negative300.bin.gz. [extraire manuellement n'est jamais recommandé]. deuxièmement, vous devriez appliquer ces commandes dans pyrhon 3:

import gensim model = gensim.models.Word2Vec.load_Word2vec_format('./model/GoogleNews-vectors-negative300.bin', binary=True) . J'espère que cela vous sera utile.

0
Maryam

si vous recevez des données d'un port série, assurez-vous que vous utilisez le bon débit (et les autres configs): décodage utilisant (tf-8), mais une configuration incorrecte 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ébut non valide

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

0
Saif Faidi