UnicodeDecodeError: кодек ascii не может декодировать байт 0xe2 в позиции 13: порядковый номер не в диапазоне (128)
Я использую 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)
Что здесь происходит?
Ответы
Ответ 1
Файл читается как куча str
s, но он должен быть unicode
s. 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()]
Это также можно решить, импортировав модуль codecs
и используя codecs.open
, а не встроенный open
.
Ответ 2
Это отлично работает для меня.
f = open(file_path, 'r+', encoding="utf-8")
Вы можете добавить третью переменную параметра, чтобы обеспечить тип кодирования "utf-8"
Примечание: этот метод отлично работает в Python3, я не пробовал его в Python2.7.
Ответ 3
Вы также можете попробовать:
import sys
reload(sys)
sys.setdefaultencoding('utf8')
Ответ 4
Для меня возникла проблема с терминальной кодировкой. Добавление UTF-8 в.bashrc решило проблему:
export LC_CTYPE=en_US.UTF-8
Не забудьте перезагрузить.bashrc впоследствии:
source ~/.bashrc
Ответ 5
Когда в Ubuntu 18.04 использовался Python3.6, я решил проблему, выполнив оба действия:
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:
Вам все еще нужно экспортировать env
export LC_ALL=C.UTF-8
Ответ 6
Чтобы найти ЛЮБЫЕ и ВСЕ ошибки, связанные с юникодом... Используя следующую команду:
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
Ответ 7
Вы можете попробовать это перед использованием строки job_titles
:
source = unicode(job_titles, 'utf-8')
Ответ 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))
Ответ 9
Укажите: # encoding = utf-8 в верхней части вашего файла Python, это должно решить проблему
Ответ 10
Используйте open(fn, 'rb').read().decode('utf-8')
вместо просто open(fn).read()
Ответ 11
Python3x или выше
-
загрузить файл в байтовом потоке:
body = '' для открытых строк ('website/index.html', 'rb'): decodedLine = lines.decode('utf-8') body = body + decodedLine.strip() вернуть тело
-
использовать глобальные настройки:
import io import sys sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding = 'utf-8')
Ответ 12
У export LC_ALL=C.UTF-8
ответа export LC_ALL=C.UTF-8
.