UnicodeDecodeError: 'ascii' 코덱이 위치 13에서 바이트 0xe2를 디코딩할 수 없음: 순서가 범위에 없음(128)
각 행이 문서로 간주되는 텍스트 파일에 대해 K 평균 클러스터링을 수행하기 위해 NLTK를 사용하고 있습니다.예를 들어, 제 텍스트 파일은 다음과 같습니다.
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)
여기서 무슨 일이 일어나고 있습니까?
파일을 여러 개의 파일로 읽고 있습니다.str
s, 하지만 그래야 합니다.unicode
Python은 암묵적으로 변환을 시도하지만 실패합니다.변경:
job_titles = [line.strip() for line in title_file.readlines()]
암호를 명시적으로 해독하기 위해str
스토unicode
(여기서 UTF-8로 가정):
job_titles = [line.decode('utf-8').strip() for line in title_file.readlines()]
또한 모듈을 가져와서 내장된 것이 아니라 사용함으로써 해결할 수 있습니다.
이것은 저에게 잘 맞습니다.
f = open(file_path, 'r+', encoding="utf-8")
세 번째 매개 변수 인코딩을 추가하여 인코딩 유형이 'utf-8'인지 확인할 수 있습니다.
참고: 이 방법은 Python3에서 잘 작동합니다. 저는 Python2.7에서 시도하지 않았습니다.
저는 터미널 인코딩에 문제가 있었습니다.UTF-8을 .bashrc에 추가하면 다음과 같은 문제가 해결되었습니다.
export LC_CTYPE=en_US.UTF-8
나중에 .bashrc를 다시 로드하는 것을 잊지 마십시오.
source ~/.bashrc
다음과 같은 방법도 사용할 수 있습니다.
import sys
reload(sys)
sys.setdefaultencoding('utf8')
도커 컨테이너에 파이썬 패키지를 설치하려고 할 때 이 오류가 발생했습니다.저에게 있어서 문제는 도커 이미지가 없다는 것이었습니다.locale
구성된도커 파일에 다음 코드를 추가하면 문제가 해결되었습니다.
# 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'
Ubuntu 18.04에서 Python 3.6을 사용할 때 다음 두 가지 방법으로 문제를 해결했습니다.
with open(filename, encoding="utf-8") as lines:
도구를 명령줄로 실행하는 경우:
export LC_ALL=C.UTF-8
Python 2.7에서는 이를 다르게 처리해야 합니다.먼저 기본 인코딩을 설정해야 합니다.
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
그런 다음 사용해야 하는 파일을 로드합니다.io.open
인코딩을 설정하려면:
import io
with io.open(filename, 'r', encoding='utf-8') as lines:
여전히 env를 내보내야 합니다.
export LC_ALL=C.UTF-8
관련된 모든 및 모든 유니코드 오류를 찾으려면...다음 명령 사용:
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
사용하다open(fn, 'rb').read().decode('utf-8')
의 대신에open(fn).read()
사용하기 전에 사용할 수 있습니다.job_titles
문자열:
source = unicode(job_titles, 'utf-8')
python 3의 경우 기본 인코딩은 "utf-8"입니다.다음 단계는 기본 설명서에 나와 있습니다. 문제가 있는 경우 https://docs.python.org/2/library/csv.html#csv-examples
함수 만들기
def utf_8_encoder(unicode_csv_data): for line in unicode_csv_data: yield line.encode('utf-8')
그런 다음 판독기 내부의 기능을 사용합니다.
csv_reader = csv.reader(utf_8_encoder(unicode_csv_data))
python3x 이상
- 바이트 스트림에서 파일 로드:
body = ''
for lines in open('website/index.html','rb'):
decodedLine = lines.decode('utf-8')
body = body+decodedLine.strip()
return body
- 전역 설정 사용:
import io
import sys
sys.stdout = io.TextIOWrapper(sys.stdout.buffer,encoding='utf-8')
언급URL : https://stackoverflow.com/questions/18649512/unicodedecodeerror-ascii-codec-cant-decode-byte-0xe2-in-position-13-ordinal
'programing' 카테고리의 다른 글
저장된 R 객체를 새 객체 이름으로 로드할 수 있습니까? (0) | 2023.07.20 |
---|---|
루비: 연결 없이 여러 줄의 문자열을 쓸 수 있습니까? (0) | 2023.07.20 |
SpringBoot Servlet을 확장해야 하는 이유외부 Tomcat에 배포하는 동안 Initializer' (0) | 2023.07.20 |
메인 클래스에서 Spring-Boot @Autowired가 null이 됩니다. (0) | 2023.07.20 |
<< 고객명 >>님과 !=님의 차이 (0) | 2023.07.20 |