161 votes

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

J'utilise NLTK pour effectuer un clustering kmeans sur mon fichier texte dans lequel chaque ligne est considérée comme un document. Donc par exemple, mon fichier texte est quelque chose comme ceci :

belong finger death punch <br>
hasty <br>
mike hasty walls jericho <br>
jägermeister rules <br>
rules bands follow performing jägermeister stage <br>
approach 

Maintenant, le code de démonstration que j'essaie d'exécuter est le suivant :

import sys

import numpy
from nltk.cluster import KMeansClusterer, GAAClusterer, euclidean_distance
import nltk.corpus
from nltk import decorators
import nltk.stem

stemmer_func = nltk.stem.EnglishStemmer().stem
stopwords = set(nltk.corpus.stopwords.words('english'))

@decorators.memoize
def normalize_word(word):
    return stemmer_func(word.lower())

def get_words(titles):
    words = set()
    for title in job_titles:
        for word in title.split():
            words.add(normalize_word(word))
    return list(words)

@decorators.memoize
def vectorspaced(title):
    title_components = [normalize_word(word) for word in title.split()]
    return numpy.array([
        word in title_components and not word in stopwords
        for word in words], numpy.short)

if __name__ == '__main__':

    filename = 'example.txt'
    if len(sys.argv) == 2:
        filename = sys.argv[1]

    with open(filename) as title_file:

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

        words = get_words(job_titles)

        # cluster = KMeansClusterer(5, euclidean_distance)
        cluster = GAAClusterer(5)
        cluster.cluster([vectorspaced(title) for title in job_titles if title])

        # NOTE: This is inefficient, cluster.classify should really just be
        # called when you are classifying previously unseen examples!
        classified_examples = [
                cluster.classify(vectorspaced(title)) for title in job_titles
            ]

        for cluster_id, title in sorted(zip(classified_examples, job_titles)):
            print cluster_id, title

(que l'on peut également trouver aquí )

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)

Qu'est-ce qui se passe ici ?

17voto

loretoparisi Points 1206

Sur Ubuntu 18.04, en utilisant Python3.6 J'ai résolu le problème en faisant les deux :

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

et si vous exécutez l'outil en ligne de commande :

export LC_ALL=C.UTF-8

Notez que si vous êtes dans Python2.7 que vous devez faire pour gérer cela différemment. Tout d'abord, vous devez définir l'encodage par défaut :

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

et ensuite pour charger le fichier vous devez utiliser io.open pour définir l'encodage :

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

Vous devez toujours exporter l'env

export LC_ALL=C.UTF-8

5voto

Egbert S Points 480

Pour trouver TOUTES les erreurs liées à l'unicode... En utilisant la commande suivante :

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

J'ai trouvé le mien dans

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

Utilisation de shed j'ai trouvé la séquence incriminée. Il s'est avéré que c'était une erreur 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

3voto

Ganesh Kharad Points 47

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

2voto

Aminah Nuraini Points 5943

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

source = unicode(job_titles, 'utf-8')

0voto

iamigham Points 87

Pour python 3, l'encodage par défaut est "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. Utilisez ensuite la fonction à l'intérieur du lecteur, par ex.

    csv_reader = csv.reader(utf_8_encoder(unicode_csv_data))

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X