UnicodeDecodeError : 'ascii'코덱이 13 위치의 바이트 0xe2를 디코딩 할 수 없습니다.


129

NLTK를 사용하여 각 줄이 문서로 간주되는 텍스트 파일에서 kmeans 클러스터링을 수행하고 있습니다. 예를 들어 내 텍스트 파일은 다음과 같습니다.

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 

이제 실행하려는 데모 코드는 다음과 같습니다.

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

( 여기 에서도 찾을 수 있습니다 )

내가받는 오류는 다음과 같습니다.

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)

여기서 무슨 일이 일어나고 있습니까?

답변:


133

파일이 strs 로 읽혀지고 있지만 unicodes 여야합니다 . 파이썬은 암시 적으로 변환하려고하지만 실패합니다. 변화:

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

strs 를 명시 적으로 디코딩하려면 unicode(여기서는 UTF-8이라고 가정) :

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

또한 수입에 의해 해결 될 수 모듈 및 사용하여 내장보다는 .codecscodecs.openopen


2
이 line.decode ( 'utf-8'). strip (). lower (). split ()을 실행하면 동일한 오류가 발생합니다. 나는 .deocode ( 'utf-8')를 추가했다
Aman Mathur

@kathirraja : 그것에 대한 참조를 제공 할 수 있습니까? 내가 아는 한 Python 3에서도 decode바이트 문자열을 유니 코드 문자열로 디코딩하는 가장 좋은 방법입니다. (그러나 내 대답의 유형은 Python 3에 적합하지 않습니다. Python 3의 경우 파이썬에서 3 bytesstr아닌 에서 로 변환하려고 str합니다 unicode.)
icktoofay

52

이것은 나를 위해 잘 작동합니다.

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

인코딩 유형이 'utf-8'이되도록 세 번째 매개 변수 인코딩 을 추가 할 수 있습니다.

참고 :이 방법은 Python3에서 제대로 작동하지만 Python2.7에서는 시도하지 않았습니다.


파이썬 2.7.10에서는 작동하지 않습니다 :TypeError: 'encoding' is an invalid keyword argument for this function
Borhan Kazimipour

2
그것은 파이썬 2.7.10에서 작동하지 않습니다 TypeError: 'encoding' is an invalid keyword argument for this function 이 잘 작동 :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에서 매력처럼 작동했습니다. 대단히 감사합니다!
SRC

32

나를 위해 터미널 인코딩에 문제가있었습니다. .bashrc에 UTF-8을 추가하면 문제가 해결되었습니다.

export LC_CTYPE=en_US.UTF-8

나중에 .bashrc를 다시로드하는 것을 잊지 마십시오.

source ~/.bashrc

3
export LC_ALL=C.UTF-8Ubuntu 18.04.3 및 Python 3.6.8 에서 사용해야 했습니다. 그렇지 않으면 이것이 내 문제를 해결했습니다. 감사합니다.
jbaranski

31

이것을 시도 할 수도 있습니다 :

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

3
이것의 의미는 무엇입니까? 이 파일에 적용 할 수있는 것이 아니라 전역적인 것 같습니다.
simeg

2
위의 내용은 Python 3에서 더 이상 사용되지 않습니다.
gented

12

Python3.6을 사용하여 Ubuntu 18.04 에서 두 가지를 모두 수행하는 문제를 해결했습니다.

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

도구를 명령 행으로 실행중인 경우 :

export LC_ALL=C.UTF-8

Python2.7에 있다면 이것을 다르게 처리해야합니다. 먼저 기본 인코딩을 설정해야합니다.

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

그런 다음 io.open인코딩을 설정하는 데 사용해야하는 파일을로드하려면 다음을 수행하십시오 .

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

여전히 환경을 내 보내야합니다

export LC_ALL=C.UTF-8

6

Docker 컨테이너에 Python 패키지를 설치하려고 할 때이 오류가 발생했습니다. 나에게 문제는 도커 이미지가 locale구성 되지 않았다는 것 입니다. Dockerfile에 다음 코드를 추가하면 문제가 해결되었습니다.

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

나는 이것을 사용해야했다 : github.com/docker-library/python/issues/13
mayrop

3

다음 명령을 사용하여 모든 유니 코드 오류와 관련된 모든 항목을 찾으려면 다음 명령을 사용하십시오.

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

내에서 발견

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

를 사용 shed하여 문제의 순서를 찾았습니다. 편집자 실수로 밝혀졌습니다.

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

job_titles문자열 을 사용하기 전에 이것을 시도 할 수 있습니다 .

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

0

파이썬 3의 경우 기본 인코딩은 "utf-8"입니다. 기본 문서에는 다음 단계가 제안됩니다. 문제 발생시 https://docs.python.org/2/library/csv.html#csv-examples

  1. 함수 만들기

    def utf_8_encoder(unicode_csv_data):
        for line in unicode_csv_data:
            yield line.encode('utf-8')
  2. 그런 다음 리더 내부의 기능을 사용하십시오 (예 :

    csv_reader = csv.reader(utf_8_encoder(unicode_csv_data))

0

python3x 이상

  1. 바이트 스트림으로 파일로드 :

    open ( 'website / index.html', 'rb')의 행에 대해 body = '': decodedLine = lines.decode ( 'utf-8') body = body + decodedLine.strip () 반환 본문

  2. 전역 설정 사용 :

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


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.