'utf-8' codec can't decode byte
Python
Erreur courante
Explication
L'erreur `UnicodeDecodeError: 'utf-8' codec can't decode byte 0x.. in position ..` survient quand vous lisez un fichier (ou des octets) en **UTF-8**, mais que son contenu n'est **pas encodé en UTF-8**. En France, le cas typique est un fichier produit par Windows ou Excel, encodé en **Latin-1 (ISO-8859-1)** ou **Windows-1252 (cp1252)**, contenant des accents.
```python
with open("donnees.csv", encoding="utf-8") as f:
contenu = f.read()
# UnicodeDecodeError: 'utf-8' codec can't decode byte 0xe9 in position 12: invalid continuation byte
```
L'octet `0xe9` correspond à `é` en Latin-1 : le fichier n'est donc pas en UTF-8.
Causes courantes
- **Fichier encodé en Latin-1 / Windows-1252** (fréquent depuis Excel ou un éditeur Windows) lu comme de l'UTF-8. - **Fichier binaire** ouvert en mode texte. - **Encodage non précisé** : Python utilise alors l'encodage par défaut du système, qui varie. - **Caractères accentués** (`é`, `à`, `ç`) dans un fichier non-UTF-8.
1. Précisez le bon encodage
with open("donnees.csv", encoding="latin-1") as f: # ou "cp1252"
contenu = f.read()
2. Détectez l'encodage en cas de doute
import chardet
with open("donnees.csv", "rb") as f:
brut = f.read()
print(chardet.detect(brut)) # {'encoding': 'ISO-8859-1', ...}
3. Tolérez les octets invalides (dernier recours)
with open("donnees.csv", encoding="utf-8", errors="replace") as f:
contenu = f.read() # remplace les octets invalides par
4. En production : convertissez une bonne fois en UTF-8
with open("source.csv", encoding="cp1252") as src, \
open("propre.csv", "w", encoding="utf-8") as dst:
dst.write(src.read())
Comment prevenir cette erreur
- **Précisez toujours `encoding=`** lors de l'ouverture d'un fichier texte.
- **Standardisez tout en UTF-8** dès l'entrée des données.
- Pour les exports Excel français, attendez-vous à du `cp1252` ; avec pandas, `pd.read_csv(..., encoding="cp1252")`.
- Référence : [docs.python.org — UnicodeDecodeError](https://docs.python.org/fr/3/library/exceptions.html#UnicodeDecodeError).
Besoin d'aide sur votre projet ?
Besoin d'aide sur un probleme technique ? Decrivez-le pour des recommandations.
Nous contacterQuestions frequentes
Que signifie `byte 0xe9` ?
C'est le code de `é` en Latin-1/Windows-1252. Sa présence indique que le fichier est dans cet encodage et non en UTF-8. Ouvrez-le avec `encoding="latin-1"` ou `encoding="cp1252"`.
`errors="replace"` ou `errors="ignore"`, lequel choisir ?
`ignore` supprime les octets invalides, `replace` les remplace par un caractère de remplacement. Les deux **masquent** le problème : préférez identifier et utiliser le bon encodage. Ne les utilisez que pour des données « sales » irrécupérables.