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 :

Problème pour faire un dictionnaire avec une boucle .


Sujet :

Python

  1. #1
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Septembre 2012
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Septembre 2012
    Messages : 7
    Points : 3
    Points
    3
    Par défaut Problème pour faire un dictionnaire avec une boucle .
    Bonjour à tous,

    je ne suis pas sur d’être au bonne endroit .

    voici mon problème :
    je fait des scan snmp sur des machines avec Python.
    le code python me retourne un dictionnaire qui s'appelle "resultat".
    L'objet "resultat" qui contient deux choses une information en clé (qui est assez complexe) et un résultat :

    je vous montre un code basique pour lire l'objet 'resultat'
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    for cle,valeur in resultat.items():
      Info = cle.split('_')
      Codepostal = Info[0]
      multiplexe =  Info[1]
      mesure =Info[2]
      ip = Info[3]
      voie = Info[4]
      Model = Info[5]
     
    #et la valeur = valeur
    bon jusqu'ici c'est pas compliqué
    avec cette boucle je voudrais organisé ces informations dans un dictionnaire qui soit plus facilement manipulable et même le mettre dans un fichier Json.
    et il doit ressembler à ceci :
    avec Codepostal, Multiplexe_voie et mesure sont des clés

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Jsonfile ={
     Codepostal:
         {Multiplexe_voie:
               {ip:"xxx", mesure:valeur}
         }
      }
    }
    pour remplir le fichier Json je fait ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    for cle,valeur in resultat.items():
    	print cle + '  ' + valeur
    	site = cle.split('_')
    	ig = site[0]
    	mux = site[1]
    	mesure = site[2]
    	ip = site[3]
    	voie = site[4]
    	recepteur = site[5]
    	Multiplexes = site[1] + '_' + site[4]
     
    	jsonfileV2['data'].setdefault(ig, {})[Multiplexes]=({'ip':ip, mesure:valeur})
    et évidement le problème c'est que le fichier Jsonfile ne conserve que la dernière ligne lu

    ex:
    voici un exemple de résultat
    2301301_R2_RfStatus_10.123.38.59_A_Harmonic 1
    2301301_R2_margin_10.123.38.59_A_Harmonic 476
    2301301_R2_ebn0_10.123.38.59_A_Harmonic 1132
    2301301_R2_cn_10.123.38.59_A_Harmonic 1546

    et voici ce que me donne la boucle :
    Jsonfile['data'] = {"2301301": {"R2_A": {"ip": "10.123.38.59", "cn": "1540"}}

    alors que je voudrais avoir ceci :
    Jsonfile['data'] = {"2301301": {"R2_A": {"ip": "10.123.38.59", "cn": "1540", "margin": "476", "ebn0":"1132", "RfStatus":"1"}}


    avez vous une idée ?

  2. #2
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Septembre 2012
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Septembre 2012
    Messages : 7
    Points : 3
    Points
    3
    Par défaut
    Re,

    Bon j'ai trouvé un truc sale
    je fait deux fois la boucle, une fois pour déclaré le dico et une deuxième fois pour le remplir . je trouve cela moche .

    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
     
    for cle in resultat.keys():
    	#print cle
    	site = cle.split('_')
    	ig = site[0]
    	mux = site[1]
    	mesure = site[2]
    	ip = site[3]
    	voie = site[4]
    	recepteur = site[5]
    	Multiplexes = site[1] + '_' + site[4]
    	if recepteur == 'Harmonic':
    		jsonfileV2['data'].setdefault(ig, {})[Multiplexes]=({'ip':ip, 'RfStatus':'', 'margin':'', 'ebn0':'', 'cn':'' })
    	elif recepteur == 'Adventech':
    		jsonfileV2['data'].setdefault(ig, {})[Multiplexes]=({'ip':ip, 'RfStatus':'', 'margin':'', 'ebn0':'', 'cn':'' })
     
    for cle,valeur in resultat.items():
    	print cle + '  ' + valeur
    	info = cle.split('_')
    	ig = info[0]
    	mux = info[1]
    	mesure = info[2]
    	ip = info[3]
    	voie = info[4]
    	recepteur = info[5]
    	Multiplexes = info[1] + '_' + info[4]
    	if recepteur == 'Harmonic':
    		jsonfileV2['data'][ig][Multiplexes][mesure]=valeur
    	elif recepteur == 'Adventech':
    		jsonfileV2['data'][ig][Multiplexes][mesure]=valeur

    qu'en pensez vous ? il y a mieux je pense

  3. #3
    Membre émérite

    Homme Profil pro
    Ingénieur calcul scientifique
    Inscrit en
    Mars 2013
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur calcul scientifique

    Informations forums :
    Inscription : Mars 2013
    Messages : 1 229
    Points : 2 328
    Points
    2 328
    Par défaut
    Citation Envoyé par beuzz4001 Voir le message
    voici un exemple de résultat
    2301301_R2_RfStatus_10.123.38.59_A_Harmonic 1
    2301301_R2_margin_10.123.38.59_A_Harmonic 476
    2301301_R2_ebn0_10.123.38.59_A_Harmonic 1132
    2301301_R2_cn_10.123.38.59_A_Harmonic 1546
    Alors oui c'est bien de donner un exemple, mais donnez nous un vrai exemple. Car si vous faites resultat.items(), c'est que résultat est un dictionnaire et là ce que vous présentez n'en est pas un !

    Avant d'entrer dans votre boucle, faites un print(resultat) et copier nous ça ici (ou bien une sous-partie, en vérifiant que soit une sous-partie valide, avec le bon nombre d'accolade et de crochet). Impossible de faire tourner quoi que ce soit pour vous aider autrement.

  4. #4
    Membre expert
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    2 873
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 2 873
    Points : 3 717
    Points
    3 717
    Par défaut
    Oui c'est vrai que ce n'est pas évident sans toutes les données du problème...

    Bon en relisant et en essayant de comprendre, j'en ai déduis qu'on peut tester avec ça :

    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    resultat = {
        "2301301_R2_RfStatus_10.123.38.59_A_Harmonic": 1,
        "2301301_R2_margin_10.123.38.59_A_Harmonic": 476,
        "2301301_R2_ebn0_10.123.38.59_A_Harmonic": 1132,
        "2301301_R2_cn_10.123.38.59_A_Harmonic": 1546
    }
     
    jsonfileV2 = {"data": {}}

  5. #5
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 804
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 804
    Points : 7 080
    Points
    7 080
    Par défaut
    Bonjour,

    Pourquoi ne pas utiliser le module json ?
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  6. #6
    Membre actif Avatar de olivier1969
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Novembre 2013
    Messages
    151
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Novembre 2013
    Messages : 151
    Points : 208
    Points
    208
    Par défaut
    Un truc dans ce style avec le module json :
    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
    import jsonfrom pprint import pprint
     
     
    resultat = {
        "2301301_R2_RfStatus_10.123.38.59_A_Harmonic": 1,
        "2301301_R2_margin_10.123.38.59_A_Harmonic": 476,
        "2301301_R2_ebn0_10.123.38.59_A_Harmonic": 1132,
        "2301301_R2_cn_10.123.38.59_A_Harmonic": 1546
    }
     
     
    jsonFile = {}
     
     
    for cle, valeur in resultat.items():
        print (cle + '  ' + str(valeur))
        site = cle.split('_')
        ig = site[0]
        mux = site[1]
        mesure = site[2]
        ip = site[3]
        voie = site[4]
        recepteur = site[5]
        Multiplexes = site[1] + '_' + site[4]
     
        if ig not in jsonFile:
            jsonFile[ig] = {}
     
        if Multiplexes not in jsonFile[ig] :
            jsonFile[ig][Multiplexes] = {}
     
        jsonFile[ig][Multiplexes]['ip'] = ip
        jsonFile[ig][Multiplexes][mesure] = valeur
     
    pprint(jsonFile)
     
     
    with open('res.json', 'w') as f:
        json.dump(jsonFile, f, indent=4)

  7. #7
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Septembre 2012
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Septembre 2012
    Messages : 7
    Points : 3
    Points
    3
    Par défaut Résolu
    Citation Envoyé par olivier1969 Voir le message
    Un truc dans ce style avec le module json :
    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
     
     
    import json
     
    resultat = {
        "2301301_R2_RfStatus_10.123.38.59_A_Harmonic": 1,
        "2301301_R2_margin_10.123.38.59_A_Harmonic": 476,
        "2301301_R2_ebn0_10.123.38.59_A_Harmonic": 1132,
        "2301301_R2_cn_10.123.38.59_A_Harmonic": 1546
    }
     
    jsonFile = {}
     
    for cle, valeur in resultat.items():
        print (cle + '  ' + str(valeur))
        site = cle.split('_')
        ig = site[0]
        mux = site[1]
        mesure = site[2]
        ip = site[3]
        voie = site[4]
        recepteur = site[5]
        Multiplexes = site[1] + '_' + site[4]
     
        if ig not in jsonFile:
            jsonFile[ig] = {}
     
        if Multiplexes not in jsonFile[ig] :
            jsonFile[ig][Multiplexes] = {}
     
        jsonFile[ig][Multiplexes]['ip'] = ip
        jsonFile[ig][Multiplexes][mesure] = valeur
     
     
    #creation du fichier  data_event.json
    fichier = open("test.json", "w")
    #ecriture dans le fichier
    e=json.dumps(jsonFile)
    fichier.write(e)
    fichier.close()

    Super !! c'est je pense la bonne solution.
    réccupéré la clef complexe, la slit et tester si la nouvelle clef existe dans le nouveau dico sinon on la crée.

    un grand merci
    PS j'ai supprimé les truc qui serve à rien

  8. #8
    Membre émérite

    Homme Profil pro
    Ingénieur calcul scientifique
    Inscrit en
    Mars 2013
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur calcul scientifique

    Informations forums :
    Inscription : Mars 2013
    Messages : 1 229
    Points : 2 328
    Points
    2 328
    Par défaut
    Petite contribution pour améliorer votre code. Sur cette portion :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
        site = cle.split('_')
        ig = site[0]
        mux = site[1]
        mesure = site[2]
        ip = site[3]
        voie = site[4]
        recepteur = site[5]
    vous pouvez écrire tout simplement en 1 ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ig,mux,mesure,ip,voie,recepteur = cle.split('_')

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

Discussions similaires

  1. Problème pour faire la rotation d'une image(Avec ImageJ)
    Par tadjara dans le forum Traitement d'images
    Réponses: 4
    Dernier message: 12/04/2010, 11h48
  2. Problème pour faire la rotation d'une image(Avec ImageJ)
    Par tadjara dans le forum Débuter avec Java
    Réponses: 0
    Dernier message: 10/04/2010, 11h33
  3. Réponses: 7
    Dernier message: 05/12/2008, 09h26
  4. Problème pour charger un set avec une clé étrangère
    Par sylvainv18 dans le forum Hibernate
    Réponses: 2
    Dernier message: 06/11/2006, 18h08
  5. problème pour faire un insert avec une image
    Par vbcasimir dans le forum Modules
    Réponses: 3
    Dernier message: 02/11/2005, 09h21

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