web-dev-qa-db-fra.com

UnicodeDecodeError: le codec 'utf8' ne peut pas décoder l'octet 0xa5 en position 0: octet de début non valide

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,

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

Avant de poster cette question, j’ai référé this de question os SO.


MISES À JOUR

La ligne suivante fait mal à l'encodeur JSON,

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 un correctif temporaire pour ça

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.

75
Dipak Ingole

L'erreur est due au fait qu'il y a du caractère non-ASCII dans le dictionnaire et qu'il ne peut pas être encodé/décodé. Un moyen simple d'éviter cette erreur consiste à coder de telles 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()
49
Santosh Ghimire

Essayez l'extrait de code ci-dessous:

with open(path, 'rb') as f:
  text = f.read()
43
Coral

Votre chaîne contient un caractère non ascii.

Ne pas pouvoir décoder avec utf-8 peut arriver si vous avez 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 toute sécurité en utf-8.

26
JCF

Je l'ai commuté simplement en définissant un autre paquet de codec dans la commande read_csv()

encoding = 'unicode_escape'
23
MSalty

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

import sys
reload(sys)
sys.setdefaultencoding("ISO-8859-1")
10
HimalayanCoder

Inspiré par aaronpenne et soumyaansh

f    = open("file.txt","rb")
text = f.read().decode(errors='replace')
9
Punnerud

A la lecture de csv j’ai ajouté une méthode de codage

import pandas as pd
dataset = pd.read_csv('sample_data.csv',header=0,encoding = 'unicode_escape')
5
Krishna prasad.m

Depuis 2018-05, cela est traité directement avec decode, du moins pour Python 3 . 

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

with open(out_file, 'rb') as f:
    for line in f:
        print(line.decode(errors='ignore'))
4
aaronpenne

La ligne suivante fait mal à l'encodeur JSON,

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 un correctif temporaire pour ça

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

Marquer ceci comme correctif comme solution temporaire.

3
Dipak Ingole

Après avoir essayé toutes les solutions susmentionnées, vous pouvez toujours exporter le fichier au format CSV (si vous en possédez déjà) . Si vous utilisez toujours la même erreur .. l'ensemble de données en tant que fichier CSV.

J'ai passé des heures ensemble alors que la solution était aussi simple. Exportez le fichier au format CSV vers le répertoire où Anaconda ou vos outils de classificateur sont installés et essayez.

1
Sushmita

Si les méthodes ci-dessus ne fonctionnent pas pour vous, vous pouvez envisager de modifier le codage du fichier csv lui-même.

Utiliser Excel:

1. Open csv file using Excel
2. Navigate to "File menu" option and click "Save As"
3. Click "Browse" to select a location to save the file
4. Enter intended filename
5. Select CSV (Comma delimited) (*.csv) option
6. Click "Tools" drop-down box and click "Web Options"
7. Under "Encoding" tab, select the option Unicode (UTF-8) from "Save this document as" drop-down list
8. Save the file

Utiliser le Bloc-notes:

1. Open csv file using notepad
2. Navigate to "File" > "Save As" option
3. Next, select the location to the file
4. Select the Save as type option as All Files(*.*)
5. Specify the file name with .csv extension
6. From "Encoding" drop-down list, select UTF-8 option.
7. Click Save to save the file

En procédant ainsi, vous devriez pouvoir importer des fichiers csv sans rencontrer la UnicodeCodeError.

1
Zuo

En général, 

Python renvoie une telle erreur lorsqu'un type d'objet illégal est tenté d'être lu comme un fichier.

par exemple. 

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

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

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

La lecture possible .npy de la même manière provoquera également ce type d’erreur 

0
Priyank Pathak