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 :

Récupérer des données d'un dictionnaire hiéarchique


Sujet :

Python

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2013
    Messages : 8
    Par défaut Récupérer des données d'un dictionnaire hiéarchique
    Bonjour à vous tous,

    Je cherche actuellement une solution en python pour exploiter/récupérer des données stocké dans un dictionnaire hiéarchique.
    Mon fichier de base est un pickle que j'exploite.

    Mon dictionnaire est constitué de la façon, suivante:
    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
    {
       'IdBloc1': {
          'action': '', 'cves': ['CVE-1','CVE-N'],'descritpion': "", 'id': 'IdBloc1', 'isummary': '', 
             'releases': {
     
                'NomReleases1': {
                   'archs': {
                      'amd64': {
                         'urls': {
                            'http://source': {'md5': '', 'size': 0 },
                            'http://sourceN': {...}
                         }
                      },
                      'i386': {...},
                      'N': {...}
                   },
                   'binaries': {'NomBinaries1': {'version': ''}, 'NomBinariesN': {'version': ''} ...},
                   'sources': {'': {'description': '','version': ''}}
                },
                'NomReleasesN': {...}
             },
          'summary': '',
          'timestamp': 128,
          'title': ''
       },
       'IdBlocN': {...}
    }

    J'ai essayé plusieurs choses mais rien de concluant, je m'en remet donc à vous qui je pense, vous etes déjà confronté à ce genre de problème.

    Je précise que mon but final est de récupérer certaine données du dictionnaire pour après les mettre dans un format XML (j'ai aussi tenté de transformer directement mon dict en xml, certaine donnée sont retourné en tant que balise et cela ne facilite pas la tâche).

    Merci de m'aider, m'orienter dans mon périple.

    Je suis en python-2.6, j'arrive à afficher les items mais je n'arrive pas à afficher les data associées.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #!/usr/bin/python
    data = "database.pickle"
    loadtexte = open(data, 'r')
    obj = dict(cPickle.load(loadtexte))
    loadtexte.close()
     
    for cle in obj.keys():
         print cle
         for keys in obj[cle]:
              print keys
    Mon résultat est le suivant :
    IdBloc1
    description
    releases
    title
    timestamp
    summary
    action
    cves
    id
    isummary

  2. #2
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2013
    Messages : 8
    Par défaut Dictionnaire hiéarchique en XML
    Comme je vous l'ai dis plus haut, j'ai essayé aussi de transformer mon dictionnaire directement en XML.
    Voici 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
    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
    import copy, pprint, cPickle
    from xml.dom.minidom import Document
    
    class dict2xml(object):
        doc     = Document()
        def __init__(self, structure):
            if type(structure) == dict:
    	   compte = len(structure) #1045-1
    	   rootName    = str(structure.keys()[1])
    	   self.root   = self.doc.createElement(rootName)
    	   self.doc.appendChild(self.root)
    	   self.build(self.root, structure[rootName])
    
        def build(self, father, structure):
            if type(structure) == dict:
                for k in structure:
                    tag = self.doc.createElement(k)
                    father.appendChild(tag)
                    self.build(tag, structure[k])
    
            elif type(structure) == list:
                grandFather = father.parentNode
                tagName     = father.tagName
                grandFather.removeChild(father)
                for l in structure:
                    tag = self.doc.createElement(tagName)
                    self.build(tag, l)
                    grandFather.appendChild(tag)
    
            else:
                data    = str(structure)
                tag     = self.doc.createTextNode(data)
                father.appendChild(tag)
    
        def affichexml(self):
            print self.doc.toprettyxml(indent="  ")
    
    
    if __name__ == '__main__':
    	filepickle = "database.pickle"
    	loadpickle = open(filepickle, 'r')
    	dictionnaire = dict(cPickle.load(loadpickle))
    #	pprint.pprint(dictionnaire)
    #	print type(dictionnaire)
    	xml = dict2xml(dictionnaire)
    	xml.affichexml()
    	loadpickle.close()
    Mais comme vous pouvez le voir je n'effectue la convertion que sur la premier IdBloc1 "rootName = str(structure.keys()[1])".
    J'ai tenté de faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for debut in range(len(structure)):
    		rootName    = str(structure.keys()[debut])
    		self.root   = self.doc.createElement(rootName)
    		self.doc.appendChild(self.root)
    	        self.build(self.root, structure[rootName])
    Mais cela me retourne une erreur sur "self.doc.appendChild(self.root)".
    File "/usr/lib/python2.6/xml/dom/minidom.py", line 1552, in appendChild "two document elements disallowed")
    xml.dom.HierarchyRequestErr: two document elements disallowed

  3. #3
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 754
    Par défaut
    Peut être regarder ce qui a été fait ici?
    Votre dictionnaire n'est pas un schéma "simple": il faudra définir des règles pour transformer des valeurs qui sont des agrégats (autres que simples) en éléments XML (et réciproquement).
    Le cas général est décrit ici.
    Bon courage,
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  4. #4
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2013
    Messages : 8
    Par défaut
    Merci "wiztricks", je regards ça de suite.

    J'ai trouvé comment récupérer les valeurs, par contre je n'arrive pas à récupérer 3 items -une liste dans un item, un numérique et une valeur qui peut etre nul)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    for cle in obj.keys():
    	ids = (obj[cle]['id'])
    	descriptions = (obj[cle]['description'])
    	titles = (obj[cle]['title'])
    	summarys = (obj[cle]['summary'])
    	actions = (obj[cle]['action'])
    	print "id : " + ids
    	print "description :" + descriptions
    	print "title :" + titles
    	print "summary :" + summarys
    	print "action :" + actions
    #	print "timestamp :" + obj[cle][timestamp]
    #	print "cves :" + obj[cle][cves]
    #	print "isummary :" + obj[cle]['isummary']
    Donc pour l'instant pour les trois derniers je ne sais pas vraiment comment faire.

  5. #5
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2013
    Messages : 8
    Par défaut
    J'ai réussi à parser mon dictionnaire, pour l'instant ce n'est pas vraiment trés beau. je vais créer des class def.
    N'hésitez pas à me faire part de vos impressions, optimisations, critiques.

    Je vais aussi le convertir en XML.

    Voici mon 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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    #!/usr/bin/python
    import os, xmlrpclib, urllib, bz2, hashlib, cPickle, pprint, contextlib, sys
    data = "database.pickle"
    loadtexte = open(data, 'r')
    obj = dict(cPickle.load(loadtexte))
    loadtexte.close()
     
     
    for cle in obj.keys():
    	ids = (obj[cle]['id'])
    	descriptions = (obj[cle]['description'])
    	descriptions = descriptions.replace("\n", " ")
    	titles = (obj[cle]['title'])
    	summarys = (obj[cle]['summary'])
    	actions = (obj[cle]['action'])
    	actions = actions.replace("\n", " ")
    	print "ID : "+ids
    	print "Description : "+descriptions
    	print "Titre : "+titles
    	print "Summary : "+summarys
    	print "Action : "+actions
     
    	listcve = list(obj[cle]['cves'])
    	for key in obj[cle]: # isummary
     		if (key) == 'isummary' :
    			isummarys = (obj[cle]['isummary'])
    			print "isummary : "+obj[cle]['isummary']
    		if (key) == 'cves' :
    			print listcve
     
    	dictreleases = dict(obj[cle]['releases'])
    	for key in dictreleases.keys(): # OS (lucid, precise, ...)
    		if (key) == ('precise' or 'lucid') : 
    			print "RELEASE : "+key
    			dictarchs = dict(dictreleases[key]['archs'])
    			for cle in dictarchs.keys(): # Architectutre (amd64, powerpc, ...)
    				print "ARCH : "+cle
    				dicturls = dict(dictarchs[cle]['urls'])
    				for urls in dicturls.keys(): # URLS sources
    					print "URL : "+urls
    					dictinfo = dict(dicturls[urls])
    					for info in sorted(dictinfo.iterkeys()):
    						print "%s: %s" % (info, dictinfo[info])

  6. #6
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2013
    Messages : 8
    Par défaut
    Quelqu'un serait comment spliter un résultat?
    J'ai dans ma variable URL une adresse http ou je dois récupérer certaines infos.
    Exemple:
    http://ports.ubuntu.com/pool/main/r/....1_powerpc.deb

    Je dois récupérer séparément:
    http://ports.ubuntu.com
    libruby1.8-dbg_1.8.7.352-2ubuntu1.1_powerpc.deb

    Merci

  7. #7
    Membre émérite

    Homme Profil pro
    Ingénieur
    Inscrit en
    Août 2010
    Messages
    662
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2010
    Messages : 662
    Par défaut
    Salut,

    Une chaine de caractère se découpe très bien avec la fonction split:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    s = 'chaine;a;spliter'
    res = s.split(';')
    res étant une liste.

    Tu peux aussi te renseigner sur les expressions régulières:

    http://en.wikibooks.org/wiki/Regular...s/Introduction

    Plus d'options et permet de rechercher des "pattern" ou bout d'expressions qui reviennent régulièrement. J'avoue ne pas m'en servir suffisament pour t'en dire plus. Je laisse ça à d'autres.


    Pour revenir à la méthode "split", dans ton cas il suffit d'enlever le 'HTTP://' de ton url (en tant que chaine de caractères), spliter avec comme séparateur le '/' et récupérer le premier et le dernier élément de la liste résulat.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    url = 'http://ports.ubuntu.com/pool/main/r/ruby1.8/libruby1.8-dbg_1.8.7.352-2ubuntu1.1_powerpc.deb'
    urlSplit = url.replace('http://','').split('/')
    res1 = 'http://'+urlSplit[0]
    res2 = urlSplit[len(urlSplit)-1]
    print res1, res2
    Ouais, bon ce n'est pas propre, mais ça marche

    Ju

  8. #8
    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,

    On devrait pouvoir faire comme ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    ch = "http://ports.ubuntu.com/pool/main/r/ruby1.8/libruby1.8-dbg_1.8.7.352-2ubuntu1.1_powerpc.deb"
     
    ch2 = ch.split('/')
    print ch2
    ['http:', '', 'ports.ubuntu.com', 'pool', 'main', 'r', 'ruby1.8', 'libruby1.8-dbg_1.8.7.352-2ubuntu1.1_powerpc.deb']
     
    print '/'.join(ch2[:3])
    http://ports.ubuntu.com
     
    print ch2[-1]
    libruby1.8-dbg_1.8.7.352-2ubuntu1.1_powerpc.deb

  9. #9
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2013
    Messages : 8
    Par défaut
    Un grand merci à vous deux, il ne me manquait plus que ça. (enfin presque).

    Maintenant il ne me reste plus qu'à :
    1-Prendre en compte les cas particuliers.
    2-Refaire un code propre (avec classe et def).
    3-Convertir en XML.

    1- Et oui, malheureusement je viens de voir qu'il n'y avait pas toujours le même type de valeurs :/
    2- Que me conseillez vous pour cette partie? (y aurait-il un guide de bonne pratique?).
    3- Pour cette partie, soit j'utilise une des bibliothèques XML soit je fais des print. Que me conseillez vous?

    Encore merci de m'aider.

    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
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    #!/usr/bin/python
    import cPickle
     
    data = "database.pickle"
    loadtexte = open(data, 'r')
    obj = dict(cPickle.load(loadtexte))
    loadtexte.close()
     
    for cle in obj.iterkeys():
    #    if cle == '1430-1' :
    	ids = (obj[cle]['id'])
    	description = (obj[cle]['description']).replace("\n", "")
    	titles = (obj[cle]['title'])
    	summarys = (obj[cle]['summary'])
    	action = (obj[cle]['action']).replace("\n", "")
    	listcve = list(obj[cle]['cves'])
    	CVES = str(listcve)
    	timestamps = str(obj[cle]['timestamp'])
    #	print ids
    ################################################
    	for key in obj[cle]: # isummary
    #		print key
    	 	if (key) == 'isummary' :
    			isummary = (obj[cle]['isummary']).replace("\n", "")
    #			print "isummary : "+isummary
    ################################################
    	dictreleases = dict(obj[cle]['releases'])
    	for key in dictreleases.keys(): # OS (lucid, precise, ...)
    		if (key == 'lucid' or key == 'oneiric' or key == 'precise' or key == 'quantal') : 
    			OS = key
    #			print "#### OS : "+OS
    ################################################
    			dictarchs = dict(dictreleases[key]['archs'])
    			for cle in dictarchs.keys(): # Architectutre (all, amd64, powerpc, ...)
    #			    if cle == 'all' :
    #				print "##Architecture : "+cle
    				ARCH = cle
     
    				dicturls = dict(dictarchs[cle]['urls'])
    				for urls in dicturls.keys(): # URLS sources
    					URL = urls
    #					print URL
    					urlSplit = URL.replace('http://','').split('/')
    					Adresses = 'http://'+urlSplit[0]
    					Packages = urlSplit[len(urlSplit)-1]
    #					print "##Adresses : "+Adresses
    #					print "##Packages : "+Packages
    					test1 = urlSplit[1]
    					if test1 == 'ubuntu':
    						canal = urlSplit[2]+"/"+urlSplit[3]
    					else :		
    						canal = urlSplit[1]+"/"+urlSplit[2]
    #					print "##CANAL : "+canal
    					dictinfo = dict(dicturls[urls])
    					for info in sorted(dictinfo.iterkeys()): # MD5 et SIZE
    						if info == 'md5' :
    							MD5 = "%s: %s" % (info, dictinfo[info])
    #							print MD5
    						if info == 'size' :
    							SIZE = "%s: %s" % (info, dictinfo[info])
    #							print SIZE
    ################################################		
    			dictbinaries = dict(dictreleases[key]['binaries'])
    			for cle in dictbinaries.keys(): # Binaires (versions)
    #				print "BINAIRES : "+cle
    				BINAIRES = cle
     
    				dictvers = dict(dictbinaries[cle])
    				for vers in dictvers.iterkeys(): # version des BINs
    					BINS = "%s: %s" % ("binaries-"+vers, dictvers[vers])
    #					print BINS
    ################################################
    			dictsources = dict(dictreleases[key]['sources'])
    			for cle in dictsources.keys(): # Sources (descriptions, versions)
    #				print "SOURCES : "+cle
    				SOURCES = cle
     
    				dictdesc = dict(dictsources[cle])
    				for vals in dictdesc.keys(): # Decription et versions des SRCs
    					if vals == 'version' :
    						SRCVERS = dictdesc[vals]
    #						print "Sources-version : "+SRCVERS
    					if vals == 'description' :
    						SRCDESC = dictdesc[vals]
    #						print "Sources-description : "+SRCDESC
    ################################################
    Valeurs retournee = {ids, description, titles, summarys, action, CVES, timestamps, isummarys, OS, ARCH, URL, canal, Adressses, Packages, MD5, SIZE, BINAIRES, BINS, SOURCES, SRCVERS, SRCDESC}

    Toutes critiques constructivent est la bien venu.

  10. #10
    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
    Bonjour.

    Concernant les critiques (constructives, bien sûr !), principalement une : la fonction iteritems pour itérer sur un dictionnaire. Cela vous changera la vie, utilisera moins votre mémoire vive et fera revenir l'être aimée. Accessoirement, cela rendra votre code plus lisible. Mais c'est moins cool que l'être aimée quand même.
    iteritems() retourne un tuple de 2 contenant la clé et la valeur. Plus besoin de dict[key], juste value. Pour un exemple, voir plus bas.

    Concernant la transformation du dictionnaire en xml. Une voie parmi d'autres serait un objet Noeud qui représente un dictionnaire, qui parcourt ses items, et qui crée des enfants noeuds chaque fois que le type d'un enfant est un dict. Si l'enfant est d'un autre type, il se passe autre chose. C'est un peu du récursif, et c'est très sympa à faire (surtout quand on loupe son essai et que l'on obtient le beau message d'erreur "too depth").
    Pour plus de facilité dans le maintien du programme, on peut utiliser des simili-évenements, en appelant des fonctions comme "ev_LE-NOM-DU-TYPE". C'est plus clair avec un exemple.

    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
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
     
    # -*- coding: utf-8 -*-
    from xml.etree import cElementTree as etree # Oui, c'est cacabeurk, mais j'ai l'habitude d'utiliser la bibliothèque lxml
     
    dirty_dict = \
    {
       'IdBloc1': {
          'action': '', 'cves': ['CVE-1','CVE-N'],'descritpion': "", 'id': 'IdBloc1', 'isummary': '', 
             'releases': {
     
                'NomReleases1': {
                   'archs': {
                      'amd64': {
                         'urls': {
                            'http://source': {'md5': '', 'size': 0 }
                         }
                      },
                      'i386': {'http://i386': {'md5': '', 'size': 55 }},
                      'N': {'http://N': {'md5': '', 'size': 75,  }}
                   },
                   'binaries': {'NomBinaries1': {'version': ''}, 'NomBinariesN': {'version': ''}},
                   'sources': {'': {'description': '','version': ''}}
                },
             },
          'summary': '',
          'timestamp': 128,
          'title': ''
       },
    }
     
    class Node(object):
        def __init__(self, name, data):
            """
            Objet noeud représentant un dictionnaire. Il sérialise au fur et à mesure
            ses items en xml, et crée d'autres noeuds si un item est lui-même un dictionnaire
            
            PARAMETERS
            ----------
            name : str
                Le nom du noeud. Il peut servir à indiquer le type de balise xml.
            data : any
                La valeur à traiter. Elle peut être de n'importe quel type.
            """
            self.name = name
            # Ici, on récupère le nom de la fonction qui sera appelé pour traiter le data
            # Si il n'y a pas de fonction pré-défini, on appelle une fonction par défaut
            self.func = getattr(self, 'ev_' + type(data).__name__, self.ev_default)
            print("Création du noeud %r appelant %r" % (self.name, self.func.__name__))
     
            # Petit exemple de traitement pour obtenir un nom de balise différent
            if name.startswith('http://'):
                self.xml = etree.Element("url")
            else:
                self.xml = etree.Element("node")
            self.xml.set('name', self.name)
            # On appelle la fonction
            self.func(data)
     
        def ev_dict(self, dict_):
            # La donnée traité est un dict. Donc, on itère sur chaque item, et on 
            # crée autant de noeuds enfant que nécéssaire.
            for key, item in dict_.iteritems():
                child = Node(key, item)
                self.xml.append(child.xml)
     
        def ev_int(self, int_):
            child = etree.SubElement(self.xml, "integer")
            child.text = str(int_)
            print('    Ceci est un int : %i' % int_)
     
        def ev_default(self, data):
            # Fonction par défaut
            child = etree.SubElement(self.xml, "UNDEFINED")
            child.text = str(data or None) # Pour éviter d'avoir une balise auto-fermante
            print('    Ceci est UNDEFINED : %r' % data)
     
     
    root = Node('dirty_dict', dirty_dict)
    with open("dirty_dict.xml", 'w') as f:
        f.write(etree.tostring(root.xml))
    La sortie dans la console:
    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
     
    Création du noeud 'dirty_dict' appelant 'ev_dict'
    Création du noeud 'IdBloc1' appelant 'ev_dict'
    Création du noeud 'summary' appelant 'ev_default'
        Ceci est UNDEFINED : ''
    Création du noeud 'releases' appelant 'ev_dict'
    Création du noeud 'NomReleases1' appelant 'ev_dict'
    Création du noeud 'sources' appelant 'ev_dict'
    Création du noeud '' appelant 'ev_dict'
    Création du noeud 'version' appelant 'ev_default'
        Ceci est UNDEFINED : ''
    Création du noeud 'description' appelant 'ev_default'
        Ceci est UNDEFINED : ''
    Création du noeud 'binaries' appelant 'ev_dict'
    Création du noeud 'NomBinaries1' appelant 'ev_dict'
    Création du noeud 'version' appelant 'ev_default'
        Ceci est UNDEFINED : ''
    Création du noeud 'NomBinariesN' appelant 'ev_dict'
    Création du noeud 'version' appelant 'ev_default'
        Ceci est UNDEFINED : ''
    Création du noeud 'archs' appelant 'ev_dict'
    Création du noeud 'i386' appelant 'ev_dict'
    Création du noeud 'http://i386' appelant 'ev_dict'
    Création du noeud 'size' appelant 'ev_int'
        Ceci est un int : 55
    Création du noeud 'md5' appelant 'ev_default'
        Ceci est UNDEFINED : ''
    Création du noeud 'amd64' appelant 'ev_dict'
    Création du noeud 'urls' appelant 'ev_dict'
    Création du noeud 'http://source' appelant 'ev_dict'
    Création du noeud 'size' appelant 'ev_int'
        Ceci est un int : 0
    Création du noeud 'md5' appelant 'ev_default'
        Ceci est UNDEFINED : ''
    Création du noeud 'N' appelant 'ev_dict'
    Création du noeud 'http://N' appelant 'ev_dict'
    Création du noeud 'size' appelant 'ev_int'
        Ceci est un int : 75
    Création du noeud 'md5' appelant 'ev_default'
        Ceci est UNDEFINED : ''
    Création du noeud 'title' appelant 'ev_default'
        Ceci est UNDEFINED : ''
    Création du noeud 'action' appelant 'ev_default'
        Ceci est UNDEFINED : ''
    Création du noeud 'timestamp' appelant 'ev_int'
        Ceci est un int : 128
    Création du noeud 'id' appelant 'ev_default'
        Ceci est UNDEFINED : 'IdBloc1'
    Création du noeud 'isummary' appelant 'ev_default'
        Ceci est UNDEFINED : ''
    Création du noeud 'descritpion' appelant 'ev_default'
        Ceci est UNDEFINED : ''
    Création du noeud 'cves' appelant 'ev_default'
        Ceci est UNDEFINED : ['CVE-1', 'CVE-N']
    Et enfin, la sortie xml (indentée) :
    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
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
     
    <?xml version="1.0"?>
    <node name="dirty_dict">
      <node name="IdBloc1">
        <node name="summary">
          <UNDEFINED>None</UNDEFINED>
        </node>
        <node name="releases">
          <node name="NomReleases1">
            <node name="sources">
              <node name="">
                <node name="version">
                  <UNDEFINED>None</UNDEFINED>
                </node>
                <node name="description">
                  <UNDEFINED>None</UNDEFINED>
                </node>
              </node>
            </node>
            <node name="binaries">
              <node name="NomBinaries1">
                <node name="version">
                  <UNDEFINED>None</UNDEFINED>
                </node>
              </node>
              <node name="NomBinariesN">
                <node name="version">
                  <UNDEFINED>None</UNDEFINED>
                </node>
              </node>
            </node>
            <node name="archs">
              <node name="i386">
                <url name="http://i386">
                  <node name="size">
                    <integer>55</integer>
                  </node>
                  <node name="md5">
                    <UNDEFINED>None</UNDEFINED>
                  </node>
                </url>
              </node>
              <node name="amd64">
                <node name="urls">
                  <url name="http://source">
                    <node name="size">
                      <integer>0</integer>
                    </node>
                    <node name="md5">
                      <UNDEFINED>None</UNDEFINED>
                    </node>
                  </url>
                </node>
              </node>
              <node name="N">
                <url name="http://N">
                  <node name="size">
                    <integer>75</integer>
                  </node>
                  <node name="md5">
                    <UNDEFINED>None</UNDEFINED>
                  </node>
                </url>
              </node>
            </node>
          </node>
        </node>
        <node name="title">
          <UNDEFINED>None</UNDEFINED>
        </node>
        <node name="action">
          <UNDEFINED>None</UNDEFINED>
        </node>
        <node name="timestamp">
          <integer>128</integer>
        </node>
        <node name="id">
          <UNDEFINED>IdBloc1</UNDEFINED>
        </node>
        <node name="isummary">
          <UNDEFINED>None</UNDEFINED>
        </node>
        <node name="descritpion">
          <UNDEFINED>None</UNDEFINED>
        </node>
        <node name="cves">
          <UNDEFINED>['CVE-1', 'CVE-N']</UNDEFINED>
        </node>
      </node>
    </node>
    Maintenant, il faut garder à l'esprit que c'est une manière de faire comme une autre, pas la meilleur, mais qui reste, j'ose espérer, maintenable et lisible.
    C'est aussi basé sur un dictionnaire assez simple, et il n'y a pas trop de filtres comme sur les urls par exemple. Donc, il faut adapter.

    En espérant que cela ait apporté un autre éclairage.

    Edit : Ooops. Je viens de relire le thread de manière plus attentive, et ça ne répond pas forcément à la question de l'OP, qui est de rangé des données. Moi, ça ne range rien du tout, ça transforme uniquement. J'essairai de faire un exemple demain soir.

  11. #11
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2013
    Messages : 8
    Par défaut
    Un grand merci à toi "Sekigo", désolé de ma réponse tardive mais j'avais un travail à terminer en urgence.

    C'est super ce que tu as fais et beaucoup plus digeste que ce que j'avais fais , je vais de suite modifier mon code.

    Merci

  12. #12
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2013
    Messages : 8
    Par défaut
    Bonjour à tous,

    Alors en faite je n'ai pas utilisé la méthode pour modifier mon dictionnaire en xml. Pour faire court, j'utilise une API ou je dois formater les données récupéré dans des tableaux et dictionaires.

    Merci à vous tous de m'avoir aidé.
    Bonne journée

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

Discussions similaires

  1. Récupérer des données dans excel
    Par alexia2 dans le forum MFC
    Réponses: 1
    Dernier message: 19/05/2005, 15h34
  2. Récupérer des données via le port usb
    Par matmuth dans le forum C++Builder
    Réponses: 12
    Dernier message: 11/05/2005, 16h34
  3. Comment récupérer des données de Outlook Express ?
    Par frenchsting dans le forum API, COM et SDKs
    Réponses: 6
    Dernier message: 29/04/2005, 11h07
  4. Récupérer des données Excel vers Interbase ...
    Par Djedjeridoo dans le forum InterBase
    Réponses: 2
    Dernier message: 20/07/2003, 18h16
  5. cherche module ou langage pour récupérer des données audio..
    Par Ry_Yo dans le forum Langages de programmation
    Réponses: 5
    Dernier message: 12/05/2003, 17h44

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