logo oujood
🔍

Encodage UTF-8 des fichiers en Python

Les erreurs d'encodage sont parmi les plus fréquentes en Python. Ce cours explique pourquoi elles surviennent et comment les éviter avec encoding='utf-8'.

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.

  📋 Copier le code

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.

  📋 Copier le code

# ❌ À é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

  📋 Copier le code

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.

  📋 Copier le code

# 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.

  📋 Copier le code

# 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.

  📋 Copier le code

# 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.

  📋 Copier le code

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