TLDR? Tentar:file = open(filename, encoding='cp437)
Por quê? Quando se usa:
file = open(filename)
text = file.read()
O Python assume que o arquivo usa a mesma página de código do ambiente atual (cp1252 no caso da postagem de abertura) e tenta decodificá-lo para seu próprio UTF-8 padrão. Se o arquivo contiver caracteres de valores não definidos nesta página de códigos (como 0x90), obteremos UnicodeDecodeError. Às vezes, não sabemos a codificação do arquivo, às vezes a codificação do arquivo pode não ser tratada pelo Python (como, por exemplo, o cp790), às vezes o arquivo pode conter codificações mistas.
Se esses caracteres não forem necessários, pode-se decidir substituí-los por pontos de interrogação, com:
file = open(filename, errors='replace')
Outra solução alternativa é usar:
file = open(filename, errors='ignore')
Os caracteres são deixados intactos, mas outros erros também serão ocultados.
A solução bastante boa é especificar a codificação, mas não nenhuma (como cp1252), mas aquela com TODOS os caracteres definidos (como cp437):
file = open(filename, encoding='cp437')
A página de código 437 é a codificação DOS original. Todos os códigos são definidos, portanto, não há erros durante a leitura do arquivo, nenhum erro é ocultado, os caracteres são preservados (não completamente intactos, mas ainda distinguíveis).