Codec UnicodeDecodeError: 'utf8' ne peut pas décoder byte 0xa5 en position 0: Byte de départ invalide

j'utilise des scripts Python-2.6 CGI mais j'ai trouvé cette erreur dans le journal du serveur en faisant json.dumps() ,

Traceback (most recent call last):
  File "/etc/mongodb/server/cgi-bin/getstats.py", line 135, in <module>
    print json.dumps(​​__get​data())
  File "/usr/lib/python2.7/json/__init__.py", line 231, in dumps
    return _default_encoder.encode(obj)
  File "/usr/lib/python2.7/json/encoder.py", line 201, in encode
    chunks = self.iterencode(o, _one_shot=True)
  File "/usr/lib/python2.7/json/encoder.py", line 264, in iterencode
    return _iterencode(o, 0)
UnicodeDecodeError: 'utf8' codec can't decode byte 0xa5 in position 0: invalid start byte

ici,

​__get​data() la fonction renvoie dictionary {} .

avant de poster cette question, j'ai mentionné cette de la question os SO.


MISES à jour

ligne suivante: mal JSON codeur,

now = datetime.datetime.now()
now = datetime.datetime.strftime(now, '%Y-%m-%dT%H:%M:%S.%fZ')
print json.dumps({'current_time': now}) // this is the culprit

j'ai eu un correctif temporaire

print json.dumps( {'old_time': now.encode('ISO-8859-1').strip() })

mais je ne suis pas sûr que ce soit la bonne façon de le faire.

55
demandé sur Community 2014-03-06 09:47:37

12 réponses

l'erreur est parce qu'il y a un caractère non-ascii dans le dictionnaire et il ne peut pas être encodé/décodé. Une façon simple d'éviter cette erreur est d'encoder ces chaînes avec la fonction encode() comme suit (si a est la chaîne avec un caractère non-ascii):

a.encode('utf-8').strip()
40
répondu Santosh Ghimire 2017-03-03 05:31:04

essayez l'extrait de code ci-dessous:

with open(path, 'rb') as f:
  text = f.read()
30
répondu Soumyaansh 2017-09-07 09:39:27

votre chaîne de caractères comporte un caractère non ascii encodé.

ne pas pouvoir décoder avec utf-8 peut se produire si vous avez eu besoin d'utiliser d'autres encodages dans votre code. Par exemple:

>>> 'my weird character \x96'.decode('utf-8')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Python27\lib\encodings\utf_8.py", line 16, in decode
    return codecs.utf_8_decode(input, errors, True)
UnicodeDecodeError: 'utf8' codec can't decode byte 0x96 in position 19: invalid start byte

dans ce cas, l'encodage est windows-1252 donc vous devez faire:

>>> 'my weird character \x96'.decode('windows-1252')
u'my weird character \u2013'

Maintenant que vous avez unicode, vous pouvez encoder en utf-8.

25
répondu JCF 2015-03-23 18:19:19

j'ai changé ceci simplement en définissant un paquet codec différent dans la commande read_csv ()

encoding = 'unicode_escape'
11
répondu MSalty 2018-05-26 01:15:05

définissez l'encodeur par défaut en haut de votre code

import sys
reload(sys)
sys.setdefaultencoding("ISO-8859-1")
9
répondu HimalayanCoder 2015-02-09 12:23:28

la ligne suivante blesse JSON encoder,

now = datetime.datetime.now()
now = datetime.datetime.strftime(now, '%Y-%m-%dT%H:%M:%S.%fZ')
print json.dumps({'current_time': now}) // this is the culprit

j'ai eu un correctif temporaire

print json.dumps( {'old_time': now.encode('ISO-8859-1').strip() })

Marquage ce comme correcte comme une solution temporaire (Pas sûr).

3
répondu Dipak Ingole 2014-03-19 10:23:35

à partir de 2018-05 ceci est traité directement avec decode , au moins pour Python 3 .

j'utilise l'extrait ci-dessous après avoir obtenu les erreurs de type invalid start byte et invalid continuation byte . L'ajout de errors='ignore' l'a réparé pour moi.

with open(out_file, 'rb') as f:
    for line in f:
        print(line.decode(errors='ignore'))
2
répondu aaronpenne 2018-05-15 22:08:29

après avoir essayé toutes les solutions de rechange mentionnées ci-dessus, si elle produit toujours la même erreur, vous pouvez essayer d'exporter le fichier en tant que CSV (une deuxième fois si vous avez déjà). Surtout si vous utilisez scikit apprendre, il est préférable d'importer l'ensemble de données comme un fichier CSV.

j'ai passé des heures ensemble, alors que la solution était aussi simple. Exportez le fichier comme un CSV dans le répertoire où Anaconda ou vos outils de classificateur sont installés et essayez.

1
répondu Sushmita 2017-03-14 14:37:24

en général,

Python envoie une telle erreur quand un type illégal d'objet est essayé d'être lu comme un fichier.

p.ex.

file = open("xyz.pkl", "r") text= file.read()

la deuxième ligne lancera l'erreur ci-dessus:

Codec UnicodeDecodeError: 'utf-8' codec ne peut pas décoder byte 0x80 en position 0: Byte de départ invalide

lecture Possible .npy d'une manière similaire sera également lancer ce genre d'erreur

0
répondu Priyank Pathak 2018-05-26 20:08:29

Inspiré par aaronpenne et Soumyaansh

f    = open("file.txt","rb")
text = f.read().decode(errors='replace')
0
répondu Punnerud 2018-07-15 20:01:42

juste dans mon cas, si je sauve le fichier excel xslx comme un CSV(virgule délimitée), l'erreur se présentera. Cependant, quand je sauve est comme CSV (MS-DOS), l'erreur ne viendra pas.

-1
répondu Xiaoxing 2018-04-23 04:12:34

ici, vous devez charger le " GoogleNews-vectors-negative300.bac.gz" fichier puis de l'extraire par cette commande dans Ubuntu: gunzip -k GoogleNews-vecteurs-negative300.bac.gz. [l'extraction manuelle n'est jamais recommandée].

deuxièmement, vous devez appliquer ces commandes en python 3:

import gensim
model = gensim.models.Word2Vec.load_word2vec_format('./model/GoogleNews-vectors-negative300.bin', binary=True)

j'espère qu'il sera utile.

-4
répondu Maryam 2018-09-04 14:46:11