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. Усі коди визначені, тому помилок під час читання файлу немає, помилок не маскується, символи зберігаються (не зовсім залишені недоторканими, але все ще помітні).