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 :

Mon arbre manque de feuille (lxml)


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 91
    Par défaut Mon arbre manque de feuille (lxml)
    Bonjour,
    Je cherche à construire un arbre xml à partir d'une arborescence de répertoires.Les répertoires sont bien représentés dans l'arbre. Maintenant, je souhaite ajouter certain fichiers dans l'arbre. Ces fichiers sont présents dans les répertoires terminaux:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    :~/Applications/ImagesTest/CytoProject/Jpp48/19/DAPI$ ls -latotal 3088
    drwxr-xr-x 2 claire claire    4096 2003-07-10 16:32 .
    drwxr-xr-x 5 claire claire    4096 2003-07-10 16:32 ..
    -rw-r--r-- 1 claire claire 3150108 2001-08-28 20:02 1.tif
    Pour l'instant le fichier xml ressemble à cela:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    CytoGenet>
      <slide name="JPP50">
        <field name="5" ROI="x0,y0,x1,y1">
          <fluorochrome name="CY3"/>
          <fluorochrome name="DAPI"/>
        </field>
    et je voudrais obtenir:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    CytoGenet>
      <slide name="JPP50">
        <field name="5" ROI="x0,y0,x1,y1">
          <fluorochrome name="CY3"/>
            <image name="1.TIF" exposure="100"/>
          <fluorochrome name="DAPI"/>
            <image name="1.TIF" exposure="10"/>
        </field>
    Le code est le suivant:
    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    # -*- coding: utf-8 -*-
    """
    Created on Tue Jan 31 13:30:22 2012
     
    @author: 
    """
    import lxml.etree as et
    import os,re
     
    def filtreImages(files):
        filtlist=[]
        #a file name like 1.TIF or 1.tif
        regex=re.compile('([1-9]+)\.(TIF|tif)$')
        if len(files)>0:
            for f in files:
                result=regex.search(f)
                if result<>None:
                    #print f
                    filtlist.append(f)
     
        #print filtlist
        return filtlist
     
    def makeNodes(node_dirs, root, leveldirlist, root_level,files):
        code={0:'slide',1:'field',2:'fluorochrome',3:'TooDeep'}
        for d in leveldirlist:
            #child = et.Element("node{0}".format(root_level), name=d)
            child = et.Element(code[root_level], name=d)
            if code[root_level]=='field':
                child.set('ROI','x0,y0,x1,y1')
            nodes_dirs[os.path.join(root, d)] = child
            nodes_dirs[root].append(child)
            if len(files)>0:        
                for image in files:
                    print " root",root," root_level",root_level," image",image
                    child=et.Element("image",name=image, position='-1,-1', exposure='0.0')
                    nodes_dirs[os.path.join(root, d)] = child
                    nodes_dirs[root].append(child)
     
    level={}            
    if __name__ == '__main__':
        topdir = '/home/claire/Applications/ImagesTest/CytoProject'
        projetxml = et.Element('CytoGenet')  # racine
        parent = projetxml
        nodes_dirs = {topdir: parent}
        ln_root = len(topdir)
     
        for root, dirs, files in os.walk(topdir):
            lvl = root[ln_root:].count(os.path.sep)
            #print nodes_dirs
            filtered=filtreImages(files)
            #print filtered
            makeNodes(nodes_dirs, root, dirs, lvl,filtered)
     
     
        print(et.tostring(projetxml,pretty_print=True))
        print projetxml.getchildren()[0].get("name")
        print projetxml.getchildren()[1].get("name")
        slides=projetxml.getchildren()
     
        metaphases1=slides[0].getchildren()
        metaphases2=slides[1].getchildren()
        for m in metaphases2:
            print m.get("name")
    Il est clair que ça coince ici:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     if len(files)>0:        
                for image in files:
                    print " root",root," root_level",root_level," image",image
                    child=et.Element("image",name=image, position='-1,-1', exposure='0.0')
                    nodes_dirs[os.path.join(root, d)] = child
                    nodes_dirs[root].append(child)
    Merci par avance de vos conseils.

    Jean-Patrick

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 91
    Par défaut
    Bonjour,
    Pour essayer de comprendre, je travaille sur un répertoire modèle:
    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    $ ls -R
    .:
    A  B
     
    ./A:
    1  2
     
    ./A/1:
    F1  F2
     
    ./A/1/F1:
    1.TIF
     
    ./A/1/F2:
    1.TIF
     
    ./A/2:
    F1  F2
     
    ./A/2/F1:
    1.TIF
     
    ./A/2/F2:
    1.TIF
     
    ./B:
    1
     
    ./B/1:
    F1  F2  F3
     
    ./B/1/F1:
    1.TIF
     
    ./B/1/F2:
    1.TIF
     
    ./B/1/F3:
    1.TIF
    avec le code précédent, j'ai l'objet xml suivant:
    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
    <CytoGenet>
      <slide name="A">
        <field name="2" ROI="x0,y0,x1,y1" coord="x,y">
          <fluorochrome name="F1"/>
          <fluorochrome name="F2"/>
        </field>
        <field name="1" ROI="x0,y0,x1,y1" coord="x,y">
          <fluorochrome name="F1"/>
          <fluorochrome name="F2"/>
        </field>
      </slide>
      <slide name="B">
        <field name="1" ROI="x0,y0,x1,y1" coord="x,y">
          <fluorochrome name="F1"/>
          <fluorochrome name="F2"/>
          <fluorochrome name="F3"/>
        </field>
      </slide>
    </CytoGenet>
    J'ai bien du mal avec os.walk, mais pas à pas, je devrais arriver à inclure les fichiers contenus dans les répertoires F1 F2 et F3, dans l'arborescence xml.

    Si quelqu'un a un tuyau... merci d'avance.

    Jean-Patrick

  3. #3
    Membre Expert

    Homme Profil pro
    Diverses et multiples
    Inscrit en
    Mai 2008
    Messages
    662
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Diverses et multiples

    Informations forums :
    Inscription : Mai 2008
    Messages : 662
    Par défaut
    Bonsoir,

    Je n’ai pas testé, mais je pense que le code de makeNodes devrait plutôt ressembler à ceci (commentaires et explications inclus dans le code )*:

    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
    def makeNodes(node_dirs, root, leveldirlist, root_level, files):
        # Penser à aérer le code, c’est plus agréable à lire...
        code = {0: 'slide', 1: 'field', 2: 'fluorochrome', 3: 'TooDeep'}
        for d in leveldirlist:
            child = et.Element(code[root_level], name=d)
            if code[root_level] == 'field':
                child.set('ROI', 'x0,y0,x1,y1')
            nodes_dirs[os.path.join(root, d)] = child
            nodes_dirs[root].append(child)
        # Le "if len(file) > 0" est inutile, si une liste est vide,
        # itérer dessus revient à ne rien faire ;)
        #
        # files est indépendant de leveldirlist, il faut donc boucler dessus
        # "à part"!
        for image in files:
            print " root:", root, " root_level:", root_level, " image:", image
            child = et.Element("image",name=image, position='-1,-1', exposure='0.0')
            # Ne surtout pas utiliser d ici! Sinon, on écrase les nœuds définis
            # dans la boucle précédente... image devrait faire l’affaire :p
            nodes_dirs[os.path.join(root, image)] = child
            nodes_dirs[root].append(child)
    Le problème clé était donc très certainement de mélanger traitement de la liste des dossiers (leveldirlist) avec celui de la list des fichiers (files)…

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 91
    Par défaut
    Un grand merci pour votre aide et vos explications.

    Jean-Patrick Pommier

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

Discussions similaires

  1. Problème avec mon arbre
    Par aljessy dans le forum Composants
    Réponses: 2
    Dernier message: 23/11/2011, 15h29
  2. Réponses: 7
    Dernier message: 09/10/2008, 13h42
  3. probleme d'arbre, evaluation des feuilles
    Par watiero dans le forum C++
    Réponses: 4
    Dernier message: 01/04/2008, 16h11
  4. JTree sans la racine de mon arbre
    Par mugwump dans le forum Composants
    Réponses: 2
    Dernier message: 24/08/2007, 10h07
  5. Réponses: 6
    Dernier message: 12/04/2007, 20h30

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