UnicodeDecodeError: кодек "ascii" не может декодировать байт 0xe2 в позиции 13: порядковый номер не в диапазоне (128)

Я использую NLTK для кластеризации kmeans в моем текстовом файле, в котором каждая строка рассматривается как документ. Например, мой текстовый файл выглядит примерно так:

принадлежат пальцу смертельный удар
поспешный
майк торопливые стены иерихон
правила егермейстера
правила группы следуют за исполнением сцены ägermeister
подход

Вот демо-код, который я пытаюсь запустить: https://gist.github.com/xim/1279283

Я получаю сообщение об ошибке:

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)

Что здесь происходит?

7 ответов

Решение

Файл читается как куча str с, но это должно быть 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,

Это прекрасно работает для меня.

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

Я получил эту ошибку при попытке установить пакет python в контейнер Docker. Для меня проблема заключалась в том, что в образе докера не было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'

Когда в 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

Чтобы найти ЛЮБЫЕ и ВСЕ ошибки Unicode, связанные... Используя следующую команду:

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

Python3x или выше

  1. загрузить файл в байтовом потоке:

    body = '' для открытых строк ('website/index.html','rb'): decodedLine = lines.decode('utf-8') body = body+decodedLine.strip() вернуть тело

  2. использовать глобальные настройки:

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

Для python 3 кодировкой по умолчанию будет "utf-8". Следующие шаги предлагаются в базовой документации: https://docs.python.org/2/library/csv.html в случае возникновения проблем.

  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))
    
Другие вопросы по тегам