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 ;cp1252est 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.
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.