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 :

problème d'affichage de liste / codage


Sujet :

Python

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 15
    Points : 11
    Points
    11
    Par défaut problème d'affichage de liste / codage
    Bonsoir !

    Je débute en python et je suis le tutoriel du site.

    J'ai un problème d'encodage lorsque je dois sortir une liste.

    Au programme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    t1 = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
    t2 = ['Janvier', u'Février', 'Mars', 'Avril', 'Mai', 'Juin', 'Juillet', u'Août', 'Septembre', 'Octobre', 'Novembre', u'Décembre']
     
    # Programme qui crée une nouvelle liste t3 contenant tous les éléments des deux listes en les alternant
    # pour que chaque nom de mois soit suivi du nombre de jours correspondant.
     
    i=0
    t3=[]
    while i<len(t1):
    	t3.append(t2[i])
    	t3.append(t1[i])
    	i=i+1
    print t2[1]
    print unicode(t3)
    La réponse est :
    Février
    ['Janvier', 31, u'F\xe9vrier', 28, 'Mars', 31, 'Avril', 30, 'Mai', 31, 'Juin', 30, 'Juillet', 31, u'Ao\xfbt', 31, 'Septembre', 30, 'Octobre', 31, 'Novembre', 30, u'D\xe9cembre', 31]
    Comme vous pouvez le voir, si je print un élément en particulier, ils sort comme il faut, si je demande toute la liste, ils sortent avec leur code Unicode.

    J'ai tenté l'utilisation d'encode, str ... sans succès.

    Si une âme charitable passant par là voulait bien m'aiguiller sur la manière d'obtenir un résultat du type
    Février
    ['Janvier', 31, 'Février', 28, 'Mars', 31, 'Avril', 30, 'Mai', 31, 'Juin', 30, 'Juillet', 31, 'Août', 31, 'Septembre', 30, 'Octobre', 31, 'Novembre', 30, 'Décembre', 31]

  2. #2
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 461
    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 461
    Points : 9 248
    Points
    9 248
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Ces problèmes d'encodage sont un vrai casse-tête...

    Le problème que tu rencontres vient du fait que certaines chaines à l'intérieur de la liste ne sont pas dans le même encodage que la console d'affichage.

    Voila une solution:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
     
    import sys
    def formate(x, decod="utf-8"):
        """cree une chaine pour affichage avec l'encodage de la console"""
        encod = sys.stdout.encoding
        if encod==None:
            encod = 'utf-8'  # cas particulier de la console d'eclipse
     
        if isinstance(x,int):
            return "%d" % (x)
     
        elif isinstance(x,str):
            return "%s" % (x.decode(decod).encode(encod,'replace'))
     
        elif isinstance(x,unicode):
            return "%s" % (x.encode(encod,'replace'))
     
        elif isinstance(x,list):
            L = "["
            if x!=[]:
                for elem in x:
                    L += "%s, " % formate(elem)
                L=L[:-2]  # pour retirer le dernier ", " en trop
            L += "]"
            return L
     
        else:
            return "%r" % (x)
    Le paramètre decod doit être initialisé à l'encodage de ton code source, celui utilisé par l'enregistrement sur disque. Pour renseigner Python il faut le préciser par la ligne d'encodage en début du code source. En ce qui me concerne, je travaille avec les codes source en "utf-8", et je commence donc la page de code source par:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    # -*- coding: utf-8 -*-
    En fait, tes chaines ont plusieurs encodages:

    - 'Janvier' a l'encodage de ton code source
    - u'Février' est en unicode (UTF-16 ou proche)

    Contrairement à ce qu'on pense, l'unicode "utf-8" n'est pas identifié par python comme type unicode, mais comme type str.

    sys.stdout.encoding permet de récupérer dans le programme l'encodage de la console d'affichage.

    Application avec ton code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    print formate(t3)
    [Janvier, 31, Février, 28, Mars, 31, Avril, 30, Mai, 31, Juin, 30, Juillet, 31, Août, 31, Septembre, 30, Octobre, 31, Novembre, 30, Décembre, 31]
    Comme la fonction formate() est récursive, elle peut afficher un arbre (liste de liste de liste...) quelque soit sa profondeur (limite=la pile de récursion).

    En complétant cette fonction, on peut traiter comme cela n'importe quel objet affichable (tuple, dictionnaire, complexe, ...), et on peut aussi résoudre le problème de formatage des nombres flottants (par exemple: afficher tous les flottants d'une liste avec 4 chiffres après la virgule). Si quelqu'un est intéressé, je peux compléter.

    Tyrtamos
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 15
    Points : 11
    Points
    11
    Par défaut
    Merci beaucoup pour cette réponse détaillée !

    Je vais tenter de la mettre en pratique maintenant

  4. #4
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 461
    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 461
    Points : 9 248
    Points
    9 248
    Billets dans le blog
    6
    Par défaut
    J'en ai profité pour mettre à jour mon tuto sur le sujet:

    http://python.jpvweb.com/mesrecettespython/arrond

    La fonction traite en supplément l'affichage des flottants, complexes, tuples, dictionnaires et toutes combinaisons.

    En plus de l'affichage, elle peut être utilisée pour préparer un enregistrement sur disque dans un encodage donné.

    Tyrtamos
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [SP-2010] problème d'affichage de liste de type de contenu externe
    Par bého32 dans le forum SharePoint
    Réponses: 10
    Dernier message: 06/07/2012, 22h44
  2. Réponses: 7
    Dernier message: 24/01/2008, 08h51
  3. [DisplayTag] Problème d'affichage de liste
    Par benoizette75 dans le forum Taglibs
    Réponses: 9
    Dernier message: 26/07/2006, 18h08
  4. Problème d'affichage de liste entre IE et FireFox
    Par slideveloppeur2006 dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 11/07/2006, 11h07
  5. problème d'affichage de liste combo hors fenêtre
    Par federb.do dans le forum Interfaces Graphiques en Java
    Réponses: 2
    Dernier message: 14/06/2006, 19h40

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