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 ?

144voto

icktoofay Points 60218

Le fichier est lu comme un tas de str mais il devrait être unicode s. Python essaie de convertir implicitement, mais échoue. Changez :

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

pour décoder explicitement le str s à unicode (en supposant ici UTF-8) :

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

Il pourrait également être résolu en important le site codecs module et en utilisant codecs.open plutôt que l'outil intégré open .

71voto

uestcfei Points 1101

Cela fonctionne bien pour moi.

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

Vous pouvez ajouter un troisième paramètre codage pour s'assurer que le type d'encodage est 'utf-8'.

Note : cette méthode fonctionne bien dans Python3, je ne l'ai pas essayé dans Python2.7.

48voto

Georgi Karadzhov Points 406

Pour moi, il y avait un problème avec l'encodage du terminal. L'ajout d'UTF-8 au fichier .bashrc a résolu le problème :

export LC_CTYPE=en_US.UTF-8

N'oubliez pas de recharger le fichier .bashrc par la suite :

source ~/.bashrc

36voto

Siva S Points 571

Vous pouvez également essayer ceci :

import sys
reload(sys)
sys.setdefaultencoding('utf8')

27voto

Jacob Stern Points 36

J'ai obtenu cette erreur en essayant d'installer un paquet python dans un conteneur Docker. Pour moi, le problème était que l'image Docker n'avait pas de fichier locale configuré. L'ajout du code suivant au Dockerfile a résolu le problème pour moi.

# Avoid ascii errors when reading files in Python
RUN apt-get install -y locales && locale-gen en_US.UTF-8
ENV LANG='en_US.UTF-8' LANGUAGE='en_US:en' LC_ALL='en_US.UTF-8'

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