TLDR? Próbować:file = open(filename, encoding='cp437)
Dlaczego? Gdy jedno użycie:
file = open(filename)
text = file.read()
Python zakłada, że plik używa tej samej strony kodowej co bieżące środowisko (cp1252 w przypadku postu otwierającego) i próbuje zdekodować go do własnego domyślnego UTF-8. Jeśli plik zawiera znaki o wartościach niezdefiniowanych na tej stronie kodowej (np. 0x90), otrzymujemy błąd UnicodeDecodeError. Czasami nie znamy kodowania pliku, czasem kodowanie pliku może być nieobsługiwane przez Python (np. Cp790), czasem plik może zawierać kodowanie mieszane.
Jeśli takie znaki nie są potrzebne, można zdecydować o ich zastąpieniu znakami zapytania:
file = open(filename, errors='replace')
Innym obejściem jest użycie:
file = open(filename, errors='ignore')
Znaki pozostaną nienaruszone, ale inne błędy również zostaną zamaskowane.
Całkiem dobrym rozwiązaniem jest określenie kodowania, ale nie kodowania (jak cp1252), ale takiego, w którym zdefiniowano WSZYSTKIE znaki (jak cp437):
file = open(filename, encoding='cp437')
Strona kodowa 437 to oryginalne kodowanie DOS. Wszystkie kody są zdefiniowane, więc nie ma błędów podczas odczytu pliku, żadnych błędów jest maskowanych, znaki są zachowywane (niezupełnie pozostawione nienaruszone, ale nadal możliwe do odróżnienia).