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 :

Mélange de formatage de chaine et de justification de caractères


Sujet :

Python

  1. #1
    Membre extrêmement actif
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 418
    Points : 1 658
    Points
    1 658
    Par défaut Mélange de formatage de chaine et de justification de caractères
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    t = ('Av2476','21 mai 1927','Linbergh atterrit à Paris','Atlantique')
    u = ('Av4839','11 septembre 2001','Attentat sur WTC','New York')
    print '%s - %s - %s - %s' % t
    print '%s - %s - %s - %s' % u
     
    # affiche:
    Av2476 - 21 mai 1927 - Linbergh atterrit à Paris - Atlantique
    Av4839 - 11 septembre 2001 - Attentat sur WTC - New York
    Mais je voudrais afficher la date dans un cartouche de longueur toujours égale à 17, en justifiant les caractères à gauche, tout en conservant le formatage de chaine.
    17 correspond à la plus longue date possible, quand il y a 'septembre'.
    ch.ljust(17) justifie à gauche ch dans un cartouche de longueur 17
    Comme t[0] fait toujours 6 caractères, cela revient à justifier t[0]+' - '+t[1] à gauche dans un cartouche de longueur 6+3+17 = 26.


    Mais je ne sais pas comment introduire ljust(26) dans l'expression plus haut sans avoir à découper le tuple. Je voudrais éviter la solution suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    t = ('Av2476','21 mai 1927','Linbergh atterrit à Paris','Atlantique')
    u = ('Av4839','11 septembre 2001','Attentat sur WTC','New York')
    print ('%s - %s' % t[0:2]).ljust(26) + ' - %s - %s' % t[2:4]
    print ('%s - %s' % u[0:2]).ljust(26) + ' - %s - %s' % u[2:4]
     
    # qui affiche bien:
    Av2476 - 21 mai 1927       - Linbergh atterrit à Paris - Atlantique
    Av4839 - 11 septembre 2001 - Attentat sur WTC - New York
    Quelqu'un a-t-il une idée ?

  2. #2
    Futur Membre du Club
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2008
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2008
    Messages : 8
    Points : 9
    Points
    9
    Par défaut Attributs de formattage
    En utilisant les attributs de formattage suivants:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    print '%s - %-17s - %s - %s' % t
    print '%s - %-17s - %s - %s' % u
    le problème devrait être résolu ...

  3. #3
    Membre extrêmement actif
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 418
    Points : 1 658
    Points
    1 658
    Par défaut Ouahhh !!!
    J'avais aussi la solution suivante, mais ça ne me plaisait toujours pas. Avec Python, je me dis toujours qu'il y a encore plus malin et plus simple que ce à quoi on pense, et je cherche, mais c'est parfois long.
    Merci pour cette solution rapidement apportée.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    t = ('Av2476','21 mai 1927','Linbergh atterrit à Paris','Atlantique')
    u = ('Av4839','11 septembre 2001','Attentat sur WTC','New York')
    print '%s - %s - %s - %s' % (t[0],t[1].ljust(17),t[2],t[3])
    print '%s - %s - %s - %s' % (u[0],u[1].ljust(17),u[2],u[3])
     
    #qui affiche:
    Av2476 - 21 mai 1927       - Linbergh atterrit à Paris - Atlantique
    Av4839 - 11 septembre 2001 - Attentat sur WTC - New York

  4. #4
    Membre extrêmement actif
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 418
    Points : 1 658
    Points
    1 658
    Par défaut
    Et si le tuple comporte 5 éléments et que je ne veux en injecter par formatage que 4 ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    t = ('Av2476','21 mai 1927','Linbergh atterrit à Paris','Atlantique','Ocean')
    u = ('Av4839','11 septembre 2001','Attentat sur WTC','New York','USA')
    print '%s - %-17s - %s - %s' % t
    print '%s - %-17s - %s - %s' % u
    print '%s - %-17s - %s - %s' % t
    TypeError: not all arguments converted during string formatting

    EDIT:
    «Comme la fonction printf en C, le formatage de chaînes en Python est un véritable couteau suisse. Il y a des options à profusion et des modificateurs de format spécifiques pour de nombreux types de valeurs.»
    http://diveintopython.adrahon.org/na...g_strings.html

    Ah bon. Donc encore un sujet à creuser.....
    Présentement je vais me contenter de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    print '%s - %-17s - %s - %s' % t[:-1]
    c'est déjà pas mal.
    Merci

  5. #5
    Membre averti
    Homme Profil pro
    Responsable du parc et des réseaux de télécommunication
    Inscrit en
    Mai 2003
    Messages
    290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Responsable du parc et des réseaux de télécommunication
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2003
    Messages : 290
    Points : 388
    Points
    388
    Par défaut
    Bonjour,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    print '%s - %-17s - %s - %s' % t[:4]
    print '%s - %-17s - %s - %s' % u[:4]
    ?

  6. #6
    Membre émérite
    Avatar de DelphiManiac
    Homme Profil pro
    Homme à tout faire
    Inscrit en
    Mars 2002
    Messages
    1 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Homme à tout faire
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 147
    Points : 2 533
    Points
    2 533
    Par défaut
    Une autre manière de voir les choses si tu n'es pas obligé d'utiliser une liste, par exemple une dictionnaire ou une classe. Les paramètres nommées permettent d'éviter la lacune que tu as rencontré sur la longueur de la liste.

    C'est un peu en dehors de la question, c'est sûr :p

    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
    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
     
    format = '%(champ1)s - %(champ2)-17s - %(champ3)s - %(champ4)s'
    class Test():
        def __init__(self, *args):
            i = 1
            for v in args:
                setattr(self, 'champ%s' % i, v)
                i += 1
     
    dic = {'champ1': 'Av2476',
           'champ2': '21 mai 1927',
           'champ3': 'Linbergh atterrit à Paris',
           'champ4': 'Atlantique',
           'champ5': 'Ocean',
    }
    print format % dic
     
     
    test = Test('Av4839', '11 septembre 2001', 'Attentat sur WTC', 'New York', 'USA')
    print format % test.__dict__
    Si ce message vous a semblé utile, il est possible qu'il soit utile à d'autres personnes. Pensez au . Et n'oubliez pas le le moment venu !

    On n'a pas à choisir si l'on est pour ou contre la décroissance, elle est inéluctable, elle arrivera qu'on le veuille ou non.

Discussions similaires

  1. Formatage de chaine avant insertion dans BDD MySQL
    Par kdson dans le forum SQL Procédural
    Réponses: 7
    Dernier message: 18/01/2008, 01h01
  2. [RegEx] Problème de formatage de chaine de caractère
    Par lecra dans le forum Langage
    Réponses: 5
    Dernier message: 29/05/2007, 14h17
  3. formatage de chaine
    Par julino dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 20/02/2007, 17h28
  4. [Tableaux] formatage de chaine
    Par renaud26 dans le forum Langage
    Réponses: 17
    Dernier message: 15/06/2006, 21h44
  5. Formatage du chaine suivant un masque
    Par AlexB59 dans le forum Langage
    Réponses: 1
    Dernier message: 07/02/2006, 10h31

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