J'essaie de travailler avec un très grand ensemble de données contenant des caractères non standard. Je dois utiliser unicode, conformément aux spécifications du travail, mais je suis déconcerté. (Et très probablement tout faire mal.)
J'ouvre le CSV en utilisant:
15 ncesReader = csv.reader(open('geocoded_output.csv', 'rb'), delimiter='\t', quotechar='"')
Ensuite, j'essaye de l'encoder avec:
name=school_name.encode('utf-8'), street=row[9].encode('utf-8'), city=row[10].encode('utf-8'), state=row[11].encode('utf-8'), zip5=row[12], zip4=row[13],county=row[25].encode('utf-8'), lat=row[22], lng=row[23])
J'encode tout sauf le lat et le lng car ceux-ci doivent être envoyés à une API. Lorsque j'exécute le programme pour analyser l'ensemble de données dans ce que je peux utiliser, j'obtiens le Traceback suivant.
Traceback (most recent call last):
File "push_into_db.py", line 80, in <module>
main()
File "push_into_db.py", line 74, in main
district_map = buildDistrictSchoolMap()
File "push_into_db.py", line 32, in buildDistrictSchoolMap
county=row[25].encode('utf-8'), lat=row[22], lng=row[23])
UnicodeDecodeError: 'ascii' codec can't decode byte 0xd1 in position 2: ordinal not in range(128)
Je pense que je devrais vous dire que j'utilise python 2.7.2, et cela fait partie d'une application construite sur django 1.4. J'ai lu plusieurs articles sur ce sujet, mais aucun d'entre eux ne semble s'appliquer directement. Toute aide sera fortement appréciée.
Vous voudrez peut-être également savoir que certains des caractères non standard à l'origine du problème sont Ñ et éventuellement É.
Réponses:
Unicode n'est pas égal à UTF-8. Ce dernier n'est qu'un encodage pour le premier.
Vous le faites dans le mauvais sens. Vous lisez des données encodées en UTF-8 , vous devez donc décoder la chaîne encodée en UTF-8 en une chaîne Unicode.
Alors remplacez simplement
.encode
par.decode
, et cela devrait fonctionner (si votre .csv est encodé en UTF-8).Il n'y a pas de quoi avoir honte, cependant. Je parie que 3 programmeurs sur 5 ont eu du mal au début à comprendre cela, sinon plus;)
Mise à jour: si vos données d'entrée ne sont pas encodées en UTF-8, vous devez
.decode()
bien sûr utiliser l'encodage approprié. Si rien n'est donné, python suppose ASCII, qui échoue évidemment sur les caractères non ASCII.la source
.decode('utf-8')
devrait faire l'affaire, ni?Ajoutez simplement ces lignes à vos codes:
la source
pour les utilisateurs de Python 3. tu peux faire
ça marche aussi avec flask :)
la source
La principale raison de l'erreur est que l'encodage par défaut supposé par python est ASCII. Par conséquent, si la chaîne de données à encoder
encode('utf8')
contient un caractère qui est en dehors de la plage ASCII, par exemple pour une chaîne comme 'hgvcj 터 파크 387', python générerait une erreur car la chaîne n'est pas dans le format de codage attendu.Si vous utilisez une version python antérieure à la version 3.5, un correctif fiable serait de définir l'encodage par défaut supposé par python sur
utf8
:De cette façon, python serait capable d'anticiper les caractères d'une chaîne qui ne relèvent pas de la plage ASCII.
Cependant, si vous utilisez python version 3.5 ou supérieure, la fonction reload () n'est pas disponible, vous devrez donc la corriger en utilisant decode, par exemple
la source
Pour les utilisateurs de Python 3:
changer le codage de «ascii» à «latin1» fonctionne.
En outre, vous pouvez essayer de trouver l'encodage automatiquement en lisant les 10000 premiers octets à l'aide de l'extrait de code ci-dessous:
la source
Les paramètres régionaux de mon ordinateur n'étaient pas définis.
J'ai d'abord fait
locale.getpreferredencoding(False)
est la fonction appelée paropen()
lorsque vous ne fournissez pas d'encodage . La sortie devrait être'UTF-8'
, mais dans ce cas, il s'agit d'une variante de l'ASCII .Ensuite, j'ai exécuté la commande bash
locale
et j'ai obtenu cette sortieDonc, j'utilisais la locale Ubuntu par défaut, ce qui oblige Python à ouvrir les fichiers au format ASCII au lieu de UTF-8. J'ai dû régler ma langue sur
en_US.UTF-8
Si vous ne pouvez pas modifier les paramètres régionaux à l'échelle du système, vous pouvez appeler tout votre code Python comme ceci:
ou faire
pour le définir dans le shell dans lequel vous l'exécutez.
la source
si vous rencontrez ce problème lors de l'exécution de certbot lors de la création ou du renouvellement du certificat, veuillez utiliser la méthode suivante
grep -r -P '[^\x00-\x7f]' /etc/apache2 /etc/letsencrypt /etc/nginx
Cette commande a trouvé le caractère incriminé "´" dans un fichier .conf du commentaire. Après l'avoir supprimé (vous pouvez modifier les commentaires comme vous le souhaitez) et recharger nginx, tout a fonctionné à nouveau.
Source: https://github.com/certbot/certbot/issues/5236
la source
Ou lorsque vous traitez du texte en Python s'il s'agit d'un texte Unicode, notez qu'il s'agit d'un texte Unicode.
Réglez
text=u'unicode text'
plutôt justetext='unicode text'
.Cela a fonctionné dans mon cas.
la source
ouvert avec encodage UTF 16 à cause de lat et long.
la source
Cela fonctionne en prenant simplement l'argument 'rb' read binary au lieu de 'r' read
la source