J'utilise des Python-2.6 CGI
scripts 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()
retourne la fonction dictionary {}
.
Avant de poster cette question, j'ai renvoyé celle de la 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 une solution 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.
dict
?dict
alist, dict, python timestamp value
__getdata
. Je ne sais pas pourquoi vous obtenez un personnage non décodable. Vous pouvez essayer de trouver des correctifs sur le dict pour le faire fonctionner, mais ceux-ci ne demandent que plus de problèmes plus tard. J'essaierais d'imprimer le dict pour voir où se trouve le caractère non-ascii. Ensuite, déterminez comment ce champ a été calculé / défini et travaillez en arrière à partir de là.Réponses:
L'erreur est due au fait qu'il y a un 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 à encoder ces chaînes avec la
encode()
fonction suivante (sia
est la chaîne avec un caractère non-ascii):la source
J'ai changé cela simplement en définissant un package de codec différent dans la
read_csv()
commande:encoding = 'unicode_escape'
Par exemple:
la source
pandas
Essayez l'extrait de code ci-dessous:
la source
r
au lieu derb
. merci pour le rappel à ajouterb
!open
fonction a «r» comme mode lecture seule.rb
représente le mode binaire de lecture.Votre chaîne contient un
ascii
caractère non codé.L'impossibilité de décoder avec
utf-8
peut se produire si vous avez besoin d'utiliser d'autres encodages dans votre code. Par exemple:Dans ce cas, l'encodage est
windows-1252
donc à faire:Maintenant que vous l'avez
Unicode
, vous pouvez encoder en toute sécuritéutf-8
.la source
A la lecture
csv
, j'ai ajouté une méthode d'encodage:la source
Définissez l'encodeur par défaut en haut de votre code
la source
À partir de 2018-05, cela est géré directement avec
decode
, au moins pour Python 3 .J'utilise l'extrait ci-dessous pour les erreurs de type
invalid start byte
et deinvalid continuation byte
type. L'ajout l'aerrors='ignore'
corrigé pour moi.la source
Inspiré par @aaronpenne et @Soumyaansh
la source
Cette solution a fonctionné pour moi:
la source
Solution simple:
la source
La ligne suivante fait mal à l'encodeur JSON,
J'ai une solution temporaire pour ça
Marquer cela comme correct en tant que solution temporaire (pas sûr).
la source
Si les méthodes ci-dessus ne fonctionnent pas pour vous, vous voudrez peut-être envisager de modifier le codage du fichier csv lui-même.
Utilisation d'Excel:
Utilisation du bloc-notes:
En faisant cela, vous devriez pouvoir importer des fichiers csv sans rencontrer l'erreur UnicodeCodeError.
la source
Après avoir essayé toutes les solutions de contournement susmentionnées, si la même erreur est toujours générée, vous pouvez essayer d'exporter le fichier au format CSV (une deuxième fois si vous avez déjà). Surtout si vous utilisez scikit learn, il est préférable d'importer l'ensemble de données sous forme de 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 classification sont installés et essayez.
la source
Vous pouvez utiliser n'importe quel codage standard de votre utilisation et de votre entrée spécifiques.
utf-8
est la valeur par défaut.iso8859-1
est également populaire en Europe occidentale.par exemple:
bytes_obj.decode('iso8859-1')
voir: docs
la source
Au lieu de chercher des moyens de décoder a5 (yen
¥
) ou 96 (en-tiret–
), dites à MySQL que votre client est encodé "latin1", mais que vous voulez "utf8" dans la base de données.Voir les détails dans Problème avec les caractères UTF-8; ce que je vois n'est pas ce que j'ai stocké
la source