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(__getdata())
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,
__getdata()
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.
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()
essayez l'extrait de code ci-dessous:
with open(path, 'rb') as f: text = f.read()
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.
j'ai changé ceci simplement en définissant un paquet codec différent dans la commande read_csv ()
encoding = 'unicode_escape'
définissez l'encodeur par défaut en haut de votre code
import sys
reload(sys)
sys.setdefaultencoding("ISO-8859-1")
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).
à 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'))
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.
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
Inspiré par aaronpenne et Soumyaansh
f = open("file.txt","rb")
text = f.read().decode(errors='replace')
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.
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.