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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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 790
    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 790
    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

+ 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, 16h34
  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, 17h34
  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, 12h07
  4. Récupérer des données Excel vers Interbase ...
    Par Djedjeridoo dans le forum InterBase
    Réponses: 2
    Dernier message: 20/07/2003, 19h16
  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, 18h44

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