Почему я получаю UnicodeDecodeError, когда читаю файл, содержащий китайские символы? - PullRequest
0 голосов
/ 12 февраля 2020
>>> path = 'name.txt'
>>> content = None
>>> with open(path, 'r') as file:
...     content = file.readlines()
... 
Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
  File "/mnt/lustre/share/miniconda3/lib/python3.6/encodings/ascii.py", line 26, in decode
    return codecs.ascii_decode(input, self.errors)[0]
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe5 in position 163: ordinal not in range(128)

Когда я запускаю этот код для чтения файла, содержащего китайские символы, я получаю сообщение об ошибке. Файл сохраняется с использованием UTF-8. Моя python версия - 3.6.5. Но все работает нормально в python2 .7.

Ответы [ 2 ]

1 голос
/ 12 февраля 2020

Python 2.7 считывает файлы в байтовые строки по умолчанию.

Python 3.x считывает файлы в строки Юникода по умолчанию, поэтому байты в файле должны быть декодированы.

Используемая кодировка по умолчанию зависит от операционной системы, но ее можно определить, вызвав locale.getpreferredencoding(False). Это часто utf8 в Linux системах, но системы Windows возвращают локализованную кодировку ANSI, например, cp1252 для версий для США / Западной Европы Windows.

В Python 3 укажите кодировка, которую вы ожидаете для файлов, чтобы не полагаться на спецификацию локали c по умолчанию. Например:

with open(path,'r',encoding='utf8') as f:
    ...

Вы также можете сделать это в Python 2, но использовать io.open(), который совместим с Python 3 open() и будет читать строки Unicode вместо строк байтов. , io.open() доступен в Python 3 для переносимости.

1 голос
/ 12 февраля 2020

open использует код ASCII c, чтобы попытаться прочитать файл. Самый простой способ исправить это - указать кодировку:

with open(path, 'r', encoding='utf-8') as file:

Ваш языковой стандарт должен, вероятно, указывать предпочтительную кодировку как UTF-8, но я думаю, что это зависит от ОС и языковых настроек.

...