Problème d'encodage des fichiers avec Python 3

Le problème exposé dans ce sujet a été résolu.

Bonjour !

J’écris un programme qui enlève l’accentuation d’un texte donné en paramètre.
J’ai suivi ce mini-tuto pour Python 3, mais le résultat n’est pas conforme, probablement à cause de l’encodage.

Les fichiers utilisés par le programme sont encodés en UTF-8 selon l’éditeur Notepad++.
De ce que j’ai lu dans la documentation, je devrais lire toute cette page pour comprendre d’où vient le problème.

Je pense qu’il doit y avoir une explication beaucoup plus simple, auriez-vous des idées ?
C’est sûrement une bête erreur dans mon code.

Code et exemple d’entrée/sortie :

Entrée :
J'aime le pain d'épices.
Sortie attendue :
J'aime le pain d'epices.
Sortie actuelle :
J'aime le pain d'a©pices.
Code source
# coding: utf-8
import os
from unicodedata import normalize, category


# 1. Ouverture du fichier en lecture seule
file = open('test-in.txt')
data = file.read()
file.close()


# 2. On enlève les accents
data = ''.join((c for c in normalize('NFD', data.lower()) if category(c) != 'Mn'))


# 3. On affiche le résultat et on l'enregistre
print(data)

file = open('test-out.txt', 'w')
file.write(data)
file.close()

os.system("pause")

Dans ton open, tu ne précises pas explicitement que tu attends de l’UTF-8. Voici ce que dit la documentation quant au comportement par défaut :

In text mode, if encoding is not specified the encoding used is platform dependent: locale.getpreferredencoding(False) is called to get the current locale encoding.

https://docs.python.org/3/library/functions.html#open

Donc je suppose que ton système n’est pas en UTF-8 par défaut. Chez moi ton code marche comme attendu car mon système est bien en UTF-8 par défaut1, mais pas le tien on dirait.

La solution la plus simple selon moi et de préciser explicitement que tu veux lire un flux UTF-8 :

open('test-in.txt', 'r', encoding='utf-8')

1 : En effet : locale.getpreferredencoding(False) = 'UTF-8' chez moi.

Comment le mettre sur utf-8 ?

Green

Je suppose que tu es sur Windows si tu as du cp1252. Je ne suis pas sûr que cela soit possible (ou même souhaitable ?) de le passer intégralement en UTF-8 mais je laisse les connaisseurs Windows me reprendre là-dessus.

De façon générale, ça ne fait jamais de mal d’indiquer explicitement dans ton code que tu attends un certain encodage en particulier. Ça évite d’avoir à retrouver des bugs parfois bien fourbes… Comme dirait le Zen of Python : "Explicit is better than implicit."

Je suppose que tu es sur Windows si tu as du cp1252. Je ne suis pas sûr que cela soit possible (ou même souhaitable ?) de le passer intégralement en UTF-8 mais je laisse les connaisseurs Windows me reprendre là-dessus.

sgble

Pas souhaitable ?! o_O tu n’as pas eu suffisamment de problème avec l’encodage visiblement. Il faut TOUT passer en UTF-8, TOUT ! Bon ok, je me calme mais très sérieusement c’est la norme par excellence qui permet d’être compatible à 100% sur Windows, Linux et Mac. Idem avec les retours à la ligne, depuis quelques années déjà on peut tout passer en LF - c’est un octet de moins et la grande majorité des IDE prennent en charge la lecture sans problème.

Pour convertir ton fichier en UTF-8, je te conseille d’installer Sublime Text. Il est parfait pour passer de n’importe quel encodage à n’importe quel autre. Tu ouvres le fichier avec et ensuite il te suffit de cliquer sur File > Save with Encoding > UTF-8. Le top avec ce logiciel c’est que tu peux mettre un gros fichier, il ne bronche pas (même 1 Go).

En effet, c’était bien ça le problème.
Chez moi, l’encodage par défaut du système est cp1252.

Comment le mettre sur utf-8 ?

Green

Heu, c’est quoi, ton système ? Difficile de t’expliquer comment changer l’encodage par défaut sans le savoir :euh:

+0 -0

Pour convertir ton fichier en UTF-8, je te conseille d’installer Sublime Text. Il est parfait pour passer de n’importe quel encodage à n’importe quel autre. Tu ouvres le fichier avec et ensuite il te suffit de cliquer sur File > Save with Encoding > UTF-8. Le top avec ce logiciel c’est que tu peux mettre un gros fichier, il ne bronche pas (même 1 Go).

Merci, mais mes fichiers sont déjà tous en UTF-8 (selon Notepad++).
Le problème se situe au niveau de la configuration de Python (si j’ai bien compris).

L’encodage utilisateur "préféré" est mis sur cp1252 et je ne sais pas comment changer cela.

En effet, c’était bien ça le problème.
Chez moi, l’encodage par défaut du système est cp1252.

Comment le mettre sur utf-8 ?

Green

Heu, c’est quoi, ton système ? Difficile de t’expliquer comment changer l’encodage par défaut sans le savoir :euh:

etherpin

J’utilise Python 3.6.8 sur Windows 8.1, 64 bits.
J’ai déjà vérifié tous les onglets proposés dans l’IDLE de Python, aucun ne parle d’encodage. :(

Pas souhaitable ?! o_O tu n’as pas eu suffisamment de problème avec l’encodage visiblement. Il faut TOUT passer en UTF-8, TOUT ! Bon ok, je me calme mais très sérieusement c’est la norme par excellence qui permet d’être compatible à 100% sur Windows, Linux et Mac.

Pas toujours. UTF-8 pose pleins de problèmes. Rien qu’obtenir le nombre de caractères d’une chaîne en UTF-8 c’est compliqué, voir impossible sous certaines contraintes ! Traiter du binaire ou de l’ASCII c’est quand même bien plus simple / rapide. De plus, sous Windows, ce n’était pas souhaitable à une époque, ça marchait mal tout simplement (la console ne supportait pas je crois)?

Bref, maintenant ça devrait être faisable. Voir la question sur StackOverflow

Idem avec les retours à la ligne, depuis quelques années déjà on peut tout passer en LF - c’est un octet de moins et la grande majorité des IDE prennent en charge la lecture sans problème.

Nope, ça marche toujours pas bien sous Windows. J’ai pas testé depuis longtemps mais il me semble que ça ne marche toujours pas au poil.

Pour convertir ton fichier en UTF-8, je te conseille d’installer Sublime Text. Il est parfait pour passer de n’importe quel encodage à n’importe quel autre. Tu ouvres le fichier avec et ensuite il te suffit de cliquer sur File > Save with Encoding > UTF-8. Le top avec ce logiciel c’est que tu peux mettre un gros fichier, il ne bronche pas (même 1 Go).

Yarflam

Notepad++ est la référence sous Windows.

+0 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte