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

550

Я пытаюсь заставить программу на 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>`  
Eden Crow
источник
2
Для этой же ошибки мне помогло это решение
Shubham Sharma
2
См. Обработка текстовых файлов в Python 3, чтобы понять, почему вы получаете эту ошибку.
Андреас Хефербург

Ответы:

961

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

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

file = open(filename, encoding="utf8")
Леннарт Регебро
источник
19
Круто, у меня была эта проблема с некоторым кодом Python 2.7, который я пытался запустить в Python 3.4. Латиноамериканец-1 работал на меня!
1vand1ng0
2
если вы используете Python 2.7 и получаете ту же ошибку, попробуйте ioмодуль:io.open(filename,encoding="utf8")
christopherlovell
9
@ 1vand1ng0: конечно, Latin-1 работает; это будет работать для любого файла, независимо от того, какова фактическая кодировка файла. Это потому, что все 256 возможных байтовых значений в файле имеют кодовую точку Latin-1 для сопоставления, но это не значит, что вы получите четкие результаты! Если вы не знаете кодировку, даже лучше открыть файл в двоичном режиме, чем предполагать Latin-1.
Мартин Питерс
1
По умолчанию это юникод, но юникод не является кодировкой. regebro.wordpress.com/2011/03/23/…
Леннарт Регебро
1
filename = "C:\Report.txt" with open(filename,encoding ="utf8") as my_file: text = my_file.read() print(text)даже после использования я получаю ту же ошибку. Я также пробовал с другой кодировкой, но все тщетно. В этом коде я тоже использую from geotext import GeoText. Пожалуйста, предложите решение.
Салах
47

Просто добавить в случае, если file = open(filename, encoding="utf8")не работает, попробуйтеfile = open(filename, errors='ignore')

Деклан Ннадозие
источник
Большое спасибо - я попробую. Есть некоторые недопустимые символы в частях файлов, которые меня не волнуют.
Стивен Натт
6
Предупреждение: это приведет к потере данных при обнаружении неизвестных символов (что может подойти в зависимости от вашей ситуации).
Ганс Голдман
34

Как продолжение ответа @ LennartRegebro :

Если вы не можете сказать, какую кодировку использует ваш файл, и приведенное выше решение не работает (это не так utf8), и вы просто догадались - есть онлайн-инструменты, которые вы можете использовать, чтобы определить, что это за кодировка. Они не идеальны, но обычно работают просто отлично. После того, как вы выясните кодировку, вы сможете использовать решение выше.

РЕДАКТИРОВАТЬ: (скопировано из комментария)

У довольно популярного текстового редактора Sublime Textесть команда для отображения кодировки, если она была установлена ​​...

  1. Перейти к View-> Show Console(или Ctrl+ `)

введите описание изображения здесь

  1. Введите в поле внизу view.encoding()и надейтесь на лучшее (я ничего не смог получить, Undefinedно, возможно, вам повезет больше ...)

введите описание изображения здесь

Матас Вайткявичюс
источник
2
Некоторые текстовые редакторы также предоставят эту информацию. Я знаю, что с Vim вы можете получить это через :set fileencoding( по этой ссылке )
PaxRomana99
3
Sublime Text, также - откройте консоль и введите view.encoding().
JimmidyJoo
Кроме того, вы можете открыть свой файл с помощью блокнота. «Сохранить как», и вы увидите раскрывающийся список с использованной кодировкой
don_Gunner94
9

Кроме того, если вам не нужно декодировать файл, например, загрузка файла на веб - сайт, open(filename, 'rb'). r = чтение, b = двоичное

Кайл Паризи
источник
Спасибо, что это был случай для моей проблемы
Shahin GH
6

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. Все коды определены, поэтому при чтении файла не возникает ошибок, ошибки не маскируются, символы сохраняются (не оставлены без изменений, но различимы).

РГА
источник
1
Вау, спасибо тебе. Это единственное дешифрование работает для меня.
Ковальский
1

Для тех, кто работает в Anaconda в Windows, у меня была такая же проблема. Блокнот ++ помогите мне решить.

Откройте файл в Notepad ++. В правом нижнем углу будет показана текущая кодировка файла. В верхнем меню рядом с «View» найдите «Encoding». В «Кодировке» перейдите в «Наборы символов» и там с терпением ищите нужное вам завершение. В моем случае кодировка «Windows-1252» была найдена в разделе «Западноевропейский».

Antoni
источник
1

Хватит тратить свое время, просто добавьте следующее encoding="cp437"и errors='ignore'к своему коду как в режиме чтения, так и записи:

open('filename.csv', encoding="cp437", errors='ignore')
open(file_name, 'w', newline='', encoding="cp437", errors='ignore')

счастливого пути

E.Zolduoarrati
источник
Конечно, сэр. Заметано. Нет времени впустую. Спасибо. Хотите чашку кофе или хорошего вина?
Прамеш Баджрачарья
0

для меня изменение кодировки символов Mysql так же, как мой код, помогло разобраться в решении. `photo = open ('pic3.png', encoding = latin1), сильный текст введите описание изображения здесь

Пиюш Рай
источник