UnicodeDecodeError: 'ascii' codec bileşeni, 13. konumdaki 0xe2 baytının kodunu çözemiyor: ordinal aralıkta değil (128)


129

Her satırın bir belge olarak kabul edildiği metin dosyamda kmeans kümeleme yapmak için NLTK kullanıyorum. Örneğin, benim metin dosyam şuna benzer:

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 

Şimdi çalıştırmaya çalıştığım demo kodu şudur:

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

(aynı zamanda, bulunabilir Burada )

Aldığım hata şudur:

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)

Burada ne oluyor?

Yanıtlar:


133

Dosya bir grup strs olarak okunuyor , ancak unicodes olmalıdır . Python örtük olarak dönüştürmeye çalışır, ancak başarısız olur. Değişiklik:

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

strs kodunun kodunu açıkça çözmek için unicode(burada UTF-8 varsayılarak):

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

Ayrıca , codecsmodülü içe aktararak codecs.openve yerleşik yerine kullanarak da çözülebilir open.


2
bu line.decode ['utf-8']. strip (). lower (). split () çalıştırmak da bana aynı hatayı veriyor. .Deocode ('utf-8') ekledim
Aman Mathur

@kathirraja: Bunun için bir referans verebilir misiniz? Bildiğim kadarıyla, Python 3'te bile, decodeyöntem bir bayt dizesini bir Unicode dizesine çözmek için tercih edilen yöntem olmaya devam ediyor. (Gerçi, benim cevap tipleri sağ Python 3 için değildir - Python 3 için biz gelen dönüştürmek için çalışıyoruz bytesiçin strgelen ziyade striçin unicode.)
icktoofay

52

Bu benim için iyi çalışıyor.

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

Kodlama türünün "utf-8" olmasını sağlamak için üçüncü bir parametre kodlaması ekleyebilirsiniz.

Not: Bu yöntem Python3'te iyi çalışıyor, Python2.7'de denemedim.


Python 2.7.10'da çalışmıyor:TypeError: 'encoding' is an invalid keyword argument for this function
Borhan Kazimipour

2
Python 2.7.10'da çalışmıyor: TypeError: 'encoding' is an invalid keyword argument for this function Bu iyi çalışıyor:import io with io.open(file_path, 'r', encoding="utf-8") as f: for line in f: do_something(line)
Borhan Kazimipour

2
Python3.6'da bir cazibe gibi çalıştı Çok teşekkürler!
SRC

32

Benim için terminal kodlamasında bir sorun vardı. UTF-8'i .bashrc'ye eklemek sorunu çözdü:

export LC_CTYPE=en_US.UTF-8

Daha sonra .bashrc dosyasını yeniden yüklemeyi unutmayın:

source ~/.bashrc

3
export LC_ALL=C.UTF-8Ubuntu 18.04.3 ve Python 3.6.8 üzerinde kullanmak zorunda kaldım . Aksi takdirde bu sorunumu çözdü, teşekkürler.
jbaranski

31

Bunu da deneyebilirsiniz:

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

3
Bu etkileri nelerdir? Bu küresel bir şey gibi görünüyor ve yalnızca bu dosya için geçerli değil.
simeg

2
Yukarıdakilerin Python 3'te kullanımdan kaldırıldığına dikkat edin.
2017'de

12

Python3.6 kullanarak Ubuntu 18.04'teyken , her ikisini de yaparak sorunu çözdüm :

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

ve aracı komut satırı olarak çalıştırıyorsanız:

export LC_ALL=C.UTF-8

İçinde bulunduğunuz eğer Not Python2.7 farklı şekilde bu işlemek için yapmak var. Öncelikle varsayılan kodlamayı ayarlamanız gerekir:

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

ve sonra dosyayı yüklemek io.openiçin kodlamayı ayarlamak için kullanmanız gerekir :

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

Yine de env'i dışa aktarmanız gerekiyor

export LC_ALL=C.UTF-8

6

Docker konteynerine python paketi kurmaya çalışırken bu hatayı aldım. Benim için sorun, docker görüntüsünün localeyapılandırılmış bir. Dockerfile'a aşağıdaki kodu eklemek sorunu benim için çözdü.

# 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'

Bunu kullanmak zorunda kaldım: github.com/docker-library/python/issues/13
mayrop

4

HERHANGİ ve TÜM unicode hatalarını bulmak için ... Aşağıdaki komutu kullanarak:

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

Benimki bulundu

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

Kullanarak shed, rahatsız edici sekansı buldum. Bir editör hatası olduğu ortaya çıktı.

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

1

Bunu job_titlesdizeyi kullanmadan önce deneyebilirsiniz :

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

0

Python 3 için varsayılan kodlama "utf-8" olacaktır. Temel belgelerde aşağıdaki adımlar önerilir: Herhangi bir sorun olması durumunda https://docs.python.org/2/library/csv.html#csv-examples

  1. Bir işlev oluşturun

    def utf_8_encoder(unicode_csv_data):
        for line in unicode_csv_data:
            yield line.encode('utf-8')
  2. Ardından okuyucunun içindeki işlevi kullanın, örneğin

    csv_reader = csv.reader(utf_8_encoder(unicode_csv_data))

0

python3x veya üstü

  1. bayt akışında dosya yükle:

    body = '' open içindeki satırlar için ('website / index.html', 'rb'): decodedLine = lines.decode ('utf-8') body = body + decodedLine.strip () return body

  2. genel ayarı kullan:

    io ithal sys sys.stdout = io.TextIOWrapper (sys.stdout.buffer, kodlama = 'utf-8')


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.