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