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 :

elementtree et compteur


Sujet :

Python

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    577
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 577
    Points : 256
    Points
    256
    Par défaut elementtree et compteur
    Bonjour,

    j'utilise la librairie ElementTree pour parser un fichier XML, et je voudrais récupérer le nombre d'éléments total :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    tree = parse(filename)
    for node in tree.findall("toto")
    ...#peut-on connaître ici le nombre total d'éléments, sans avoir à incrémenter un compteur à chaque passage ?
    merci par avance
    @+

  2. #2
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    941
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 941
    Points : 1 384
    Points
    1 384
    Par défaut
    Je n'ai jamais utilisé ElementTree, mais je crois pouvoir te répondre uniquement sur base de la doc.

    Dans la doc de la méthode findall de ElementTree:
    Returns:
    A list or iterator containing all matching elements, in section order.
    Elle retourne donc une liste OU un itérateur.
    Si c'est un liste qui est retournée, tu peux utiliser la fonction len pour avoir sa taille.
    Si c'est un itérateur, non, il faut le parcourir.

    Comme, d'après la doc, ce n'est pas forcément toujours une liste qui est retournée, tu ne peux pas l'assumer même si tu fais un test et que cela semble être le cas.

    Donc, la réponse est non, il faut toujours prévoir le parcours, même si, pour optimiser, tu peux tester s'il s'agit d'une liste et dans ce cas appeler len:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    totos = tree.findall('toto')
    if isinstance(totos, list):
        nb_elems = len(totos)
    else:
        nb_elems = 0
        for node in totos:
            nb_elems += 1
    Attention de ne parcourir l'itérateur qu'une seule fois. Si tu utilises ce code tel quel, tu seras forcé d'appeler findall une seconde fois si tu souhaite faire un autre traitement sur le résultat... Mais dans ce cas, l'optimisation n'est pas utile vu que tu dois de toute façon parcourir l'itérateur ou la liste.

  3. #3
    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
    Même si tu as un itérateur, tu peux avoir la longueur, il suffit que tu cast le résultat par list(xx).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
     
    def test():
        for i in xrange(10):
            yield i
     
    print len(list(test()))
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
     
    def test():
        return [0, 1, 2, 3]
     
    print len(list(test()))
    Dans les 2 cas tu as la longueur, sans te préoccuper de savoir si c'est une liste ou non.
    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.

  4. #4
    Membre actif
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    577
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 577
    Points : 256
    Points
    256
    Par défaut
    OK,
    merci beaucoup à vous deux.
    En fait, j'avoue que j'ai fait de nombreux essais, et j'obtiens tout le temps une liste, donc j'utilise len().

    Merci
    @+

  5. #5
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    941
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 941
    Points : 1 384
    Points
    1 384
    Par défaut
    merci, delphi, j'y avais pas pensé. Pour ma défense, la conversion (est-ce vraiment un cast ?) en liste parcourt tout de même l'itérateur

  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
    C'est pas un cast au sens C du terme, c'est une conversion et par contre cela duplique l'info.
    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.

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

Discussions similaires

  1. [FLASH MX2004] Compteur progressif 0 à 95%
    Par DJeys dans le forum Flash
    Réponses: 5
    Dernier message: 21/07/2004, 14h58
  2. [XSL FO] Compteur a partir de 2
    Par Hugo001 dans le forum XSL/XSLT/XPATH
    Réponses: 7
    Dernier message: 30/06/2004, 11h39
  3. [PB CONCEPTUEL] avec compteur/trigger
    Par kase74 dans le forum SQL
    Réponses: 6
    Dernier message: 25/03/2004, 11h02
  4. Remise à 0 d'un compteur automatique
    Par missllyss dans le forum SQL
    Réponses: 4
    Dernier message: 15/12/2003, 16h46
  5. Migration Access > SQL Server (suite) : Compteur
    Par LadyArwen dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 06/03/2003, 14h08

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