OUJOOD.COM
Vous ouvrez un fichier texte en Python, et vous obtenez une erreur UnicodeDecodeError. Ou pire : le fichier s'ouvre sans erreur, mais les caractères accentués sont remplacés par des symboles illisibles. Ces problèmes viennent tous du même endroit : l'encodage.
Un fichier texte n'est qu'une suite d'octets. L'encodage est la règle qui dit comment convertir ces octets en caractères lisibles. Si Python utilise une règle différente de celle avec laquelle le fichier a été créé, les caractères ne correspondent plus. Ce cours explique comment fonctionne l'encodage, pourquoi UTF-8 est le standard à adopter, et comment lire et écrire des fichiers sans jamais avoir ce problème.
Qu'est-ce que l'encodage ?
Chaque caractère — une lettre, un chiffre, un accent, un emoji — correspond à un nombre. L'encodage définit cette correspondance. Il en existe plusieurs : ASCII (128 caractères, pas d'accents), Latin-1 (256 caractères, accents occidentaux), UTF-8 (plus d'un million de caractères, toutes les langues du monde).
UTF-8 est aujourd'hui le standard du web et de la plupart des systèmes modernes. Il est rétrocompatible avec ASCII : un fichier ASCII pur est aussi un fichier UTF-8 valide.
Le problème : l'encodage par défaut de Python
Quand vous ouvrez un fichier avec open() sans préciser l'encodage, Python utilise l'encodage par défaut du système d'exploitation. Sur Linux et Mac, c'est généralement UTF-8. Sur Windows, c'est souvent cp1252 (Windows-1252). Un fichier créé sur Linux et ouvert sur Windows sans préciser l'encodage peut donc produire des erreurs ou des caractères corrompus.
import locale # Voir l'encodage par défaut du système print(locale.getpreferredencoding()) # Résultat selon le système : # Linux/Mac → UTF-8 # Windows → cp1252
La solution : toujours préciser encoding="utf-8"
La règle est simple : ajoutez toujours encoding="utf-8" quand vous ouvrez un fichier texte. Cela rend votre code portable et prévisible, quel que soit le système où il tourne.
# ❌ À éviter : encodage dépend du système with open("fichier.txt", "r") as f: contenu = f.read() # ✅ Bonne pratique : encodage explicite with open("fichier.txt", "r", encoding="utf-8") as f: contenu = f.read() # ✅ Idem pour l'écriture with open("sortie.txt", "w", encoding="utf-8") as f: f.write("Texte avec des accents : é, à, ç, ñ, ü")
Lire un fichier avec des accents
from pathlib import Path # Créer un fichier UTF-8 avec des accents p = Path("poeme.txt") p.write_text("Être ou ne pas être,\nvoilà la question.", encoding="utf-8") # Le relire correctement contenu = p.read_text(encoding="utf-8") print(contenu) # Résultat : # Être ou ne pas être, # voilà la question.
Gérer les erreurs d'encodage
Parfois vous recevez un fichier dont l'encodage est incertain ou partiellement corrompu. Le paramètre errors de open() contrôle ce qui se passe quand Python rencontre un octet qu'il ne sait pas décoder.
# errors="strict" → lève une exception (comportement par défaut) with open("fichier.txt", "r", encoding="utf-8", errors="strict") as f: contenu = f.read() # errors="ignore" → ignore les octets non décodables with open("fichier.txt", "r", encoding="utf-8", errors="ignore") as f: contenu = f.read() # errors="replace" → remplace les octets invalides par le symbole ? with open("fichier.txt", "r", encoding="utf-8", errors="replace") as f: contenu = f.read()
En pratique : utilisez errors="replace" quand vous analysez un fichier dont vous ne contrôlez pas la source et que vous préférez un résultat imparfait à une exception.
Détecter l'encodage d'un fichier inconnu
Si vous recevez un fichier et que vous ne savez pas son encodage, la bibliothèque chardet peut le détecter automatiquement. Elle analyse les octets du fichier et propose un encodage probable avec un indice de confiance.
# Installation : pip install chardet import chardet # Lire le fichier en mode binaire with open("fichier_inconnu.txt", "rb") as f: octets = f.read() # Détecter l'encodage resultat = chardet.detect(octets) print(resultat) # Exemple de résultat : # {'encoding': 'ISO-8859-1', 'confidence': 0.73, 'language': ''} # Lire le fichier avec l'encodage détecté encodage = resultat["encoding"] with open("fichier_inconnu.txt", "r", encoding=encodage) as f: contenu = f.read() print(contenu)
Convertir un fichier vers UTF-8
Cas pratique : vous avez un fichier encodé en Latin-1 (fréquent sur d'anciens systèmes Windows ou avec des exports Excel français) et vous voulez le convertir en UTF-8.
# Lire avec l'encodage d'origine with open("ancien.txt", "r", encoding="latin-1") as f: contenu = f.read() # Réécrire en UTF-8 with open("nouveau_utf8.txt", "w", encoding="utf-8") as f: f.write(contenu) print("Conversion terminée.")
Encodage dans les chaînes Python
En Python 3, toutes les chaînes de caractères (str) sont Unicode en interne. L'encodage n'entre en jeu qu'aux frontières : quand on lit ou écrit un fichier, quand on envoie des données sur le réseau, ou quand on convertit une chaîne en octets manuellement.
texte = "Bonjour, café !" # Convertir une chaîne en octets (bytes) octets = texte.encode("utf-8") print(octets) # Résultat : b'Bonjour, caf\xc3\xa9 !' # Reconvertir des octets en chaîne texte_retrouve = octets.decode("utf-8") print(texte_retrouve) # Résultat : Bonjour, café ! # UTF-8 encode é sur 2 octets print(len("é".encode("utf-8"))) # Résultat : 2
Par carabde | Mis à jour le 21 avril 2026