Corriger l’encodage des caractères dans Python et pandas

pandas lit é au lieu de é, s’arrête sur une UnicodeDecodeError, ou Excel affiche mal votre CSV exporté ? En Python, le paramètre encoding fait la différence. Voici les cas typiques, et vous pouvez réparer les fichiers cassés dans le navigateur ci-dessus.

Fonctionne avec du texte et ces fichiers :

  • CSV
  • TXT
  • JSON
  • XML
  • SRT
  • VTT
  • SMI
  • TSV
  • MD
  • HTML
  • SQL
  • LOG

Par exemple des exports Excel, des sauvegardes de bases de données, des sous-titres ou du code de site web.

Réparer

  1. Déposez un fichier ou collez du texte
  2. La réparation est automatique
  3. Copiez ou téléchargez
ou glissez simplement un fichier ici

UnicodeDecodeError à la lecture

pd.read_csv attend de l’UTF-8. Si le fichier est enregistré en Windows-1252 (ANSI), pandas s’arrête avec UnicodeDecodeError: 'utf-8' codec can't decode byte 0xe9 : 0xE9 est é en Windows-1252. Indiquez alors l’encodage :

  • pd.read_csv('donnees.csv', encoding='cp1252') pour les fichiers venant d’Excel et de Windows.
  • encoding='latin-1' n’échoue jamais, mais lit mal € et les guillemets typographiques ; cp1252 est en général le meilleur choix.
  • Si vous ne connaissez pas l’encodage, déposez le fichier dans Mojibuster : il le détecte et l’enregistre en UTF-8.

é au lieu de é dans le DataFrame

Si le DataFrame affiche é, un fichier UTF-8 a été lu en latin-1 ou cp1252, ou les données étaient déjà cassées. Dans le premier cas, encoding='utf-8' suffit. Si les données elles-mêmes sont abîmées, valeur.encode('cp1252').decode('utf-8') aide pour des valeurs isolées. Avec des données mélangées, cela échoue dès qu’une cellule est déjà correcte. Plus simple : réparez le fichier avec Mojibuster, puis lisez-le.

Un CSV de pandas ouvert dans Excel sans BOM

Avant

nom,ville,chiffre
Renée Dubois,Montréal,1250 €
François Lefèvre,Besançon,980 €

Après

nom,ville,chiffre
Renée Dubois,Montréal,1250 €
François Lefèvre,Besançon,980 €

to_csv : Excel affiche mal le fichier

df.to_csv('export.csv') écrit de l’UTF-8 sans BOM. Excel ouvre ces fichiers comme de l’ANSI et les lettres accentuées deviennent é. Avec encoding='utf-8-sig', pandas écrit un BOM et Excel reconnaît l’UTF-8. Plus de détails : Excel affiche des caractères bizarres.

open() sous Windows

open('fichier.txt') sans encoding utilise l’encodage du système sous Windows, en général cp1252. Un script qui marche sous Linux lit alors le même fichier UTF-8 en é sous Windows. Passez donc toujours encoding='utf-8' ou réglez la variable d’environnement PYTHONUTF8=1. Avec la PEP 686, UTF-8 deviendra de toute façon la valeur par défaut dans les futures versions de Python.

Données web avec requests

requests déduit response.text de l’en-tête Content-Type. Si une réponse texte n’y indique pas de jeu de caractères, la bibliothèque suppose ISO-8859-1 et les pages UTF-8 affichent é. Réglez d’abord response.encoding = 'utf-8', ou utilisez response.json(), qui détecte seul l’UTF-8.

Si du texte a été écrit avec errors='replace' dans un encodage sans les caractères nécessaires, le fichier contient des ? : l’information est alors perdue, voir les points d’interrogation à la place des accents.

Questions fréquentes

Existe-t-il une bibliothèque Python pour cela ?

Oui, ftfy corrige le mojibake dans le code Python. Pour des fichiers isolés sans programmer, Mojibuster est plus rapide et vous montre chaque modification avant l’enregistrement.

Quelles valeurs d’encoding sont les plus utiles ?

utf-8, utf-8-sig (UTF-8 avec BOM), cp1252 (Windows, Europe occidentale), latin-1 et utf-16. La casse et les tirets n’ont pas d’importance.

Les séparateurs et les nombres sont-ils conservés ?

Oui. Mojibuster ne modifie que les caractères cassés. Virgules, guillemets et retours à la ligne restent exactement tels quels.

Autres guides