IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Encore un problème de caractères accentués


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Novembre 2003
    Messages
    554
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 554
    Par défaut Encore un problème de caractères accentués
    Bonjour,

    Je dispose du code suivant par lequel je lis un premier fichier que je copie dans un second
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    # -*- coding:Latin-1 -*- 
    Entree = open("Fichier1.dat",'r')
    Sortie = open("Fichier2.dat",'w')
    while True:
       Ligne=Entree.readline()
       if Ligne =='': break
       Sortie.write(Ligne.decode('Utf-8'))
    Sortie.close()
    Entree.close()
    Le problème est que ce programme plante.

    Si je remplace l'instruction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Sortie.write(Ligne.decode('Utf-8'))
    par
    Le programme ne plante plus mais les caractères accentués du premier fichier sont retranscrits bizarrement.
    par exemple : lycée à la place de lycée

    Quelqu'un aurait-il la solution de ce problème ?

  2. #2
    Expert confirmé

    Avatar de deusyss
    Homme Profil pro
    Expert Python
    Inscrit en
    Mars 2010
    Messages
    1 659
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Expert Python
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 659
    Par défaut
    Bonjour,

    Je pense que le probleme se pose à la lecture principalement. As tu essayé de dire à python d'executer l'ensemble du code en utf8? avec la commande
    en début de fichier source

  3. #3
    Membre émérite
    Homme Profil pro
    Aucune activité
    Inscrit en
    Novembre 2011
    Messages
    505
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Aucune activité

    Informations forums :
    Inscription : Novembre 2011
    Messages : 505
    Par défaut
    Bonjour,
    Utiliser Python3, non? Et en utilisant utf8 globalement?
    (Il n'y a pus de problème de ce type avec python3)
    Et sinon, quelle est l'erreur exactement?

    Clodion

    PS: Désolé Deussys!!

  4. #4
    Expert confirmé

    Avatar de deusyss
    Homme Profil pro
    Expert Python
    Inscrit en
    Mars 2010
    Messages
    1 659
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Expert Python
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 659
    Par défaut
    Aucun soucis, on est là pour aider

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2012
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2012
    Messages : 48
    Par défaut
    Ton fichier d'entrée est en encodage 'latin-1'.
    Donc, il faut que tu fasses :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Sortie.write(Ligne.decode('latin-1'))
    Et je te conseille d'oublier le latin-1, sauf si besoin spécifique (si tu ne sais pas ce que c'est un encodage, tu passes en utf-8, point).

    Donc, au début de ton fichier, comme relevé plus haut :
    Et pour dire explicitement que tu souhaites écrire un fichier en utf-8 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    # On part du principe que tu n'as pas modifié le fichier d'entrée, toujours encodé en latin-1
    Sortie.write(Ligne.decode('latin-1').encode('utf-8'))
    Et ça m'étonnerais que Python3 ne lève plus d'erreurs sur des soucis d'encodage. En tout cas, ça serait vraiment dommageable, parce que les levées d'erreurs d'encodage m'ont sauvé la vie bien plus d'une fois. Ça peut paraitre chiant pour les débutants, mais croyez-moi, surtout dans un contexte pro, c'est indispensable si on ne veut pas se retrouver avec des données "corrompus" et chiante à nettoyer.

  6. #6
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 486
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Si je résume ce que je fais dans le domaine des encodages avec Python 2:

    D'une manière générale, on ne travaille en interne qu'en unicode! Comme d'ailleurs Python 3. On fait donc:
    -> le plus vite possible les changements d'encodage nécessaires en entrée,
    -> et le plus tard possible les changements d'encodage nécessaires en sortie.

    A noter que travailler en interne en utf-8 est une grosse source de problèmes. Par exemple, si le 'é' est en utf-8, len('é')==2!

    Pour les pages de code Python, la ligne au tout début d'une page de code "# -*-coding:utf-8 -*", indispensable (mais on peut choisir un autre encodage), n'indique qu'une seule chose: que les chaines codées en dur dans la page sont en utf-8. Cela n'indique pas que Python travaille en utf-8. Avec Python 2, il suffit de mettre un 'u' devant la chaine de caractères comme x=u"Gérard", et elle sera convertie par Python en unicode. On peut aussi faire une conversion explicite: x="Gérard".decode("utf-8") qui donnera le même résultat.

    Bien entendu, cette même ligne "# -*-coding:utf-8 -*" nécessite impérativement que l'éditeur qui a été utilisé pour construire le code Python, est bien configuré pour éditer en utf-8, et a bien enregistré le code sur disque en utf-8!

    Pour les lectures de fichiers texte, il est très intéressant d'utiliser le module codecs. Ainsi, si le texte est en latin1, le code suivant le fera venir en mémoire en unicode:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    import codecs
    with codecs.open("fichier.txt", "r", "latin1") as f:
        lignes = f.readlines()
    Pour les écritures de fichiers texte, c'est pareil avec codecs: la conversion unicode => latin1 se fera toute seule.

    Pour les entrées / sorties en console, ça dépend de l'encodage de la console! Sous Windows, par exemple, la console est en "cp850" (alors que Windows lui-même demande du "cp1252"). Sous Linux, c'est le plus souvent de l'"utf-8". La conversion doit donc être explicite (toujours avec des données en mémoire en unicode). Par exemple avec la console Windows: pour les entrées: x.decode("cp850") et pour les sorties: x.encode("cp850").

    D'une manière générale pour les affichages, il faut bien connaître l'encodage de la console de sortie, y compris pour l'affichage dans les afficheurs des outils de développement ou des bibliothèques graphiques (tkinter, pyqt, pygtk, wxpython). Par exemple, Eclipse accepte l'utf-8, mais PyScripter demande le "cp1252" de Windows. Dans la plupart des cas, on obtient cet encodage avec "sys.stdout.encoding", mais ça ne marche pas toujours: certains afficheurs renvoient "None". En tout cas, si on se trompe, ça peut être une source d'erreur difficile à comprendre: on peut avoir un mauvais affichage (comme " lycée") alors que la donnée est correctement encodée en interne!

  7. #7
    Membre éclairé
    Inscrit en
    Novembre 2003
    Messages
    554
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 554
    Par défaut
    Ca marche en utilisant ton code Sekigo :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Sortie.write(Ligne.decode('latin-1').encode('utf-8'))
    Merci pour tes explications tyrtamos.
    Ta dernière remarque est exactement le cas sur lequel j'ai buté à l'origine.
    on peut avoir un mauvais affichage (comme " lycée") alors que la donnée est correctement encodée en interne!
    Merci à tous.

Discussions similaires

  1. Réponses: 5
    Dernier message: 24/01/2007, 23h22
  2. [JSTL] Problème de caractères accentués
    Par youdev dans le forum Taglibs
    Réponses: 2
    Dernier message: 05/12/2006, 15h06
  3. Problème de caractères accentués avec CAM::DBF
    Par ustilago dans le forum Modules
    Réponses: 4
    Dernier message: 23/06/2006, 08h46
  4. problème de caractères accentués (type êéè)
    Par zarbi61 dans le forum Général Python
    Réponses: 4
    Dernier message: 19/05/2006, 20h12
  5. [MiniPascal] Problème de caractères accentués
    Par Clandestino dans le forum Autres IDE
    Réponses: 3
    Dernier message: 03/10/2004, 13h12

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo