Вопрос-Ответ

UnicodeDecodeError: 'charmap' codec can't decode byte X in position Y: character maps to

UnicodeDecodeError: кодек 'charmap' не может декодировать байт X в позиции Y: символ сопоставляется с

Я пытаюсь заставить программу на Python 3 выполнить некоторые манипуляции с текстовым файлом, заполненным информацией. Однако при попытке прочитать файл я получаю следующую ошибку:

Traceback (most recent call last):  
File "SCRIPT LOCATION", line NUMBER, in <module>
text = file.read()
File "C:\Python31\lib\encodings\cp1252.py", line 23, in decode
return codecs.charmap_decode(input,self.errors,decoding_table)[0]
UnicodeDecodeError: 'charmap' codec can't decode byte 0x90 in position 2907500: character maps to `<undefined>`

После прочтения этих вопросов и ответов смотрите Как определить кодировку текста, если вам нужна помощь в определении кодировки файла, который вы пытаетесь открыть.

Переведено автоматически
Ответ 1

В рассматриваемом файле не используется кодировка CP1252. В нем используется другая кодировка. Какую именно, вы должны выяснить сами. Распространенными являются Latin-1 и UTF-8. Поскольку 0x90 на самом деле ничего не означает в Latin-1, UTF-8 (где 0x90 - байт продолжения) более вероятен.

Вы указываете кодировку при открытии файла:

file = open(filename, encoding="utf8")
Ответ 2

Если file = open(filename, encoding="utf-8") не работает, попробуйте

file = open(filename, errors="ignore"), если вы хотите удалить ненужные символы. (документы)

Ответ 3

В качестве альтернативы, если вам не нужно декодировать файл, например, при загрузке файла на веб-сайт, используйте:

open(filename, 'rb')

где r = чтение, b = двоичный

Ответ 4

TLDR: Попробуйте: file = open(filename, encoding='cp437')

Почему? Когда используется:

file = open(filename)
text = file.read()

Python предполагает, что файл использует ту же кодовую страницу, что и текущая среда (cp1252 в случае начального сообщения), и пытается декодировать ее по своему собственному умолчанию UTF-8. Если файл содержит символы значений, не определенных в этой кодовой странице (например, 0x90), мы получаем UnicodeDecodeError. Иногда мы не знаем кодировку файла, иногда кодировка файла может не обрабатываться Python (например, cp790), иногда файл может содержать смешанные кодировки.

Если такие символы не нужны, можно решить заменить их вопросительными знаками на:

file = open(filename, errors='replace')

Другим обходным путем является использование:

file = open(filename, errors='ignore')

При этом символы остаются нетронутыми, но другие ошибки также будут замаскированы.

Очень хорошее решение - указать кодировку, но не любую кодировку (например, cp1252), а ту, в которой определены ВСЕ символы (например, cp437):

file = open(filename, encoding='cp437')

Кодовая страница 437 - это исходная кодировка DOS. Все коды определены, поэтому при чтении файла ошибок нет, ошибки не замаскированы, символы сохранены (не совсем сохранены, но все еще различимы).

python python-3.x unicode