web-dev-qa-db-fra.com

UnicodeDecodeError: le codec 'ascii' ne peut pas décoder l'octet 0xe2 en position 13: l'ordinal n'est pas dans la plage (128)

J'utilise NLTK pour effectuer le regroupement en kméens de mon fichier texte dans lequel chaque ligne est considérée comme un document. Ainsi, par exemple, mon fichier texte ressemble à ceci:

appartient le coup mortel 
précipité 
mike murs précipités jericho 
jägermeister règles 
règles suivies par les groupes jägermeister 
approche 

Maintenant, le code de démonstration que je tente d’exécuter est le suivant: https://Gist.github.com/xim/1279283

L'erreur que je reçois est la suivante:

Traceback (most recent call last):
File "cluster_example.py", line 40, in
words = get_words(job_titles)
File "cluster_example.py", line 20, in get_words
words.add(normalize_Word(word))
File "", line 1, in
File "/usr/local/lib/python2.7/dist-packages/nltk/decorators.py", line 183, in memoize
result = func(*args)
File "cluster_example.py", line 14, in normalize_Word
return stemmer_func(Word.lower())
File "/usr/local/lib/python2.7/dist-packages/nltk/stem/Snowball.py", line 694, in stem
Word = (Word.replace(u"\u2019", u"\x27")
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe2 in position 13: ordinal not in range(128)

Que se passe-t-il ici?

98
user2602812

Le fichier est lu comme un groupe de strs, mais il devrait s'agir de unicodes. Python tente de convertir implicitement, mais échoue. Changement:

job_titles = [line.strip() for line in title_file.readlines()]

pour décoder explicitement les strs en unicode (ici en supposant UTF-8):

job_titles = [line.decode('utf-8').strip() for line in title_file.readlines()]

Vous pouvez également résoudre ce problème en important le module codecs et en utilisant codecs.open plutôt que le open intégré.

110
icktoofay

Cela fonctionne bien pour moi.

f = open(file_path, 'r+', encoding="utf-8")

Vous pouvez ajouter un troisième paramètre encoding pour vous assurer que le type de codage est 'utf-8'

Remarque: cette méthode fonctionne bien en Python3, je ne l'ai pas essayée en Python2.7.

28
uestcfei

Vous pouvez aussi essayer ceci:

import sys
reload(sys)
sys.setdefaultencoding('utf8')
26
Siva S

Pour moi, il y avait un problème avec le codage du terminal. Ajouter UTF-8 à .bashrc a résolu le problème:

export LC_CTYPE=en_US.UTF-8

N'oubliez pas de recharger .bashrc ensuite:

source ~/.bashrc
18
Georgi Karadzhov

Pour rechercher toutes les erreurs Unicode liées à ... à l'aide de la commande suivante:

grep -r -P '[^\x00-\x7f]' /etc/Apache2 /etc/letsencrypt /etc/nginx

Trouvé le mien dans

/etc/letsencrypt/options-ssl-nginx.conf:        # The following CSP directives don't use default-src as 

En utilisant shed, j'ai trouvé la séquence fautive. Il s’est avéré être une erreur de la part de l’éditeur . 00008099: C2 194 302 11000010 00008100: A0 160 240 10100000 00008101: d 64 100 144 01100100 00008102: e 65 101 145 01100101 00008103: f 66 102 146 01100110 00008104: a 61 097 141 01100001 00008105: u 75 117 165 01110101 00008106: l 6C 108 154 01101100 00008107: t 74 116 164 01110100 00008108: - 2D 045 055 00101101 00008109: s 73 115 163 01110011 00008110: r 72 114 162 01110010 00008111: c 63 099 143 01100011 00008112: C2 194 302 11000010 00008113: A0 160 240 10100000

2
Egbert S

Vous pouvez essayer ceci avant d'utiliser la chaîne job_titles:

source = unicode(job_titles, 'utf-8')
1
Aminah Nuraini

Quand je suis sur Ubuntu 18.04 avec Python3.6 j’ai résolu le problème en faisant les deux:

with open(filename, encoding="utf-8") as lines:

et si vous utilisez l'outil en ligne de commande:

export LC_ALL=C.UTF-8

Notez que si vous êtes dans Python2.7 vous devez gérer cela différemment. Vous devez d’abord définir le codage par défaut:

import sys
reload(sys)
sys.setdefaultencoding('utf-8')

et pour charger le fichier, vous devez utiliser io.open pour définir le codage:

import io
with io.open(filename, 'r', encoding='utf-8') as lines:

Vous avez encore besoin d'exporter env

export LC_ALL=C.UTF-8
1
loretoparisi

python3x ou supérieur

  1. charger le fichier dans le flux d'octets:

    body = '' pour les lignes en open ('website/index.html', 'rb'): decodedLine = lines.decode ('utf-8') body = body + decodedLine.strip () return body

  2. utiliser le paramètre global:

    import io import sys sys.stdout = io.TextIOWrapper (sys.stdout.buffer, encoding = 'utf-8')

0
io big

Pour Python 3, le codage par défaut serait "utf-8". Les étapes suivantes sont suggérées dans la documentation de base: https://docs.python.org/2/library/csv.html#csv-examples en cas de problème 

  1. Créer une fonction

    def utf_8_encoder(unicode_csv_data):
        for line in unicode_csv_data:
            yield line.encode('utf-8')
    
  2. Puis utilisez la fonction à l’intérieur du lecteur, par exemple.

    csv_reader = csv.reader(utf_8_encoder(unicode_csv_data))
    
0
iamigham

Il suffit de faire ce qui suit -------------------------

faire open(fn, 'rb').read().decode('utf-8') au lieu de open(fn).read()

0
Ganesh Kharad