TLDR? Essayer:file = open(filename, encoding='cp437)
Pourquoi? Quand on utilise:
file = open(filename)
text = file.read()
Python suppose que le fichier utilise la même page de code que l'environnement actuel (cp1252 dans le cas de la publication d'ouverture) et essaie de le décoder en son propre UTF-8 par défaut. Si le fichier contient des caractères de valeurs non définies dans cette page de code (comme 0x90), nous obtenons UnicodeDecodeError. Parfois, nous ne connaissons pas l'encodage du fichier, parfois l'encodage du fichier peut être non géré par Python (comme par exemple cp790), parfois le fichier peut contenir des encodages mixtes.
Si de tels caractères sont inutiles, on peut décider de les remplacer par des points d'interrogation, avec:
file = open(filename, errors='replace')
Une autre solution consiste à utiliser:
file = open(filename, errors='ignore')
Les caractères restent alors intacts, mais les autres erreurs seront également masquées.
Une assez bonne solution consiste à spécifier l'encodage, mais pas n'importe quel encodage (comme cp1252), mais celui qui a TOUS les caractères définis (comme cp437):
file = open(filename, encoding='cp437')
La page de codes 437 est l'encodage DOS d'origine. Tous les codes sont définis, il n'y a donc aucune erreur lors de la lecture du fichier, aucune erreur n'est masquée, les caractères sont préservés (pas tout à fait intacts mais toujours reconnaissables).