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,
La fonction __getdata()
renvoie dictionary {}
.
Avant de poster cette question, j’ai référé this de question os SO.
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.
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()
Essayez l'extrait de code ci-dessous:
with open(path, 'rb') as f: text = f.read()
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.
Je l'ai commuté simplement en définissant un autre paquet de codec dans la commande read_csv()
encoding = 'unicode_escape'
Placez l'encodeur par défaut en haut de votre code
import sys
reload(sys)
sys.setdefaultencoding("ISO-8859-1")
Inspiré par aaronpenne et soumyaansh
f = open("file.txt","rb")
text = f.read().decode(errors='replace')
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')
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'))
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.
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.
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.
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