Débutant python dictionnaire sérialisé

Débutant python dictionnaire sérialisé - Python - Programmation

Marsh Posté le 02-03-2015 à 14:44:43    

Bonjour,
 
Je suis débutant python. j'utilise la version 2.7.6 sous Linux ubuntu.
Dans un script j'utilise un dictionnaire sérialisé.
L'objectif est de travailler sur un dictionnaire sérialisé. Ici j'ai pris comme exemple un agenda en mode console sans interface.
 
Script

Code :
  1. print "Exemple dico"
  2.     entree_agenda_1 = dict()
  3.     entree_agenda_2 = dict()
  4.     entree_agenda_1['nom'] = 'dupond'
  5.     entree_agenda_1['prenom'] = 'jean'
  6.     entree_agenda_1['telephone'] = '0023659125'
  7.    
  8.     entree_agenda_2['nom'] = 'dupond'
  9.     entree_agenda_2['prenom'] = 'steve'
  10.     entree_agenda_2['telephone'] = '00685432987'
  11.    
  12.     agenda = [entree_agenda_1, entree_agenda_2] #Liste
  13.     print agenda
  14.    
  15.     print "\nEnregistrement du dictionnaire"
  16.     nom_fichier="/home/laurent/dico_agenda.dic"
  17.     nom_dico="agenda"
  18.     #Fichier = open(nom_fichier,'wb')
  19.     #print "liste: "+str(nom_dico)
  20.     #pickle.dump(nom_dico, Fichier)   # sérialisation
  21.     #Fichier.close()
  22.    
  23.     Fichier = open(nom_fichier,'wb')
  24.     print "liste: "+str(nom_dico)
  25.     pickle.dump(agenda, Fichier)   # sérialisation
  26.     Fichier.close()


 
résultat :

Code :
  1. laurent@Laurent-Bureau:~$ python /home/laurent/python/cours-python/dico.py
  2. Exemple dico
  3. [{'nom': 'dupond', 'prenom': 'jean', 'telephone': '0023659125'}, {'nom': 'dupond', 'prenom': 'steve', 'telephone': '00685432987'}]
  4. Enregistrement du dictionnaire
  5. liste: agenda
  6. laurent@Laurent-Bureau:~$


 
Contenu du fichier  

Code :
  1. laurent@Laurent-Bureau:~$ cat /home/laurent/dico_agenda.dic
  2. (lp0
  3. (dp1
  4. S'nom'
  5. p2
  6. S'dupond'
  7. p3
  8. sS'prenom'
  9. p4
  10. S'jean'
  11. p5
  12. sS'telephone'
  13. p6
  14. S'0023659125'
  15. p7
  16. sa(dp8
  17. g2
  18. g3
  19. sg4
  20. S'steve'
  21. p9
  22. sg6
  23. S'00685432987'
  24. p10
  25. sa.laurent@Laurent-Bureau:~$


 
Pour chargé le dico, j'ai fait :

Code :
  1. nom_fichier="/home/laurent/dico_agenda.dic" 
  2.     nom_dico="agenda"
  3.     Fichier = open(nom_fichier,'rb')
  4.     agenda = pickle.load(Fichier)    # désérialisation
  5.     Fichier.close()
  6.     print(agenda)


ça marche très bien.
 
Resultat :

Code :
  1. [{'nom': 'dupond', 'prenom': 'jean', 'telephone': '0023659125'}, {'nom': 'dupond', 'prenom': 'steve', 'telephone': '00685432987'}]


 
Cependant je ne comprends pas comment :
1/ Modifier un contact
2/ Supprimer un contact
3/ Ajouter un contact.
 
Objectif du travail : Créer un dico sérialisé, le gardé en mémoire, l'enregistrer dans un fichier, le charger, modifier des valeurs, suppression des valeurs,  ajouter des valeurs.
Pouvez-vous m'aiguiller ?
 
Merci.


Message édité par xunil2003 le 02-03-2015 à 14:54:25
Reply

Marsh Posté le 02-03-2015 à 14:44:43   

Reply

Marsh Posté le 02-03-2015 à 15:06:47    

C'est peu complexe:
 
- déjà créé deux fonctions, une qui enregistre ton dico, une qui lit et qui retourne le dico qu'elle a lu (c'est en gros ce que tu as fait, mais séparé en fonction).
 
Ensuite pour modifier/ajouter/supprimer, il te faut un dictionnaire (ca c'est OK), et l'utilisation de quelques fonctions:
 
- append (donc agenda.append) pour ajouter un élément
- remove pour retirer un élement
 
La modification se fait directement depuis un index donné.
 
Tu peux être intéressé par deux choses, vu que tu es débutant:
- Python c'est de l'interprété, donc peut y aller comme ca dans le shell: ouvre un cmd, tappe "python" et fait directement les tests dont tu as besoin
- Tu peux être intéressé par dir(agenda) qui va te printer une partie des fonctions associés à l'objet agenda (donc associé à n'importe quel dict).
 
Avec dict tu devrais retrouver les fonctions pop, append, count, insert qui sont les plus courantes.

Reply

Marsh Posté le 02-03-2015 à 18:57:33    

bonjour,
 
Tout d'abord merci de votre réponse.
J'ai séparé le chargement et l'enregistrement du dico dans chacun une fonction.
Puis j'ai essayé d'ajouter des contacts.
 
Le code :

Code :
  1. #!/usr/local/bin/python
  2. # -*- coding:utf-8 -*-
  3. import pickle
  4. print "python /home/laurent/python/cours-python/dico-forum-hardware.py"
  5. print
  6. def lecture_dico():
  7.     global agenda
  8.     texte = "Chargement du dictionnaire em mémoire"
  9.     print texte
  10.     longueur_texte = len(texte)
  11.     print (longueur_texte * '-')
  12.     print
  13.    
  14.     nom_fichier="/home/laurent/dico_agenda.dic" 
  15.     nom_dico="agenda"
  16.     Fichier = open(nom_fichier,'rb')
  17.     agenda = pickle.load(Fichier)    # désérialisation
  18.     Fichier.close()
  19.     print(agenda)
  20.     #print agenda[0]['nom']
  21.     #print(nom[0])
  22.     print
  23. def enregistre_dico():
  24.     texte = "Enregistrement du dictonnaire dans un fichier"
  25.     print texte
  26.     longueur_texte = len(texte)
  27.     print (longueur_texte * '-')
  28.     print
  29.  
  30.     nom_fichier="/home/laurent/dico_agenda.dic"
  31.     nom_dico="agenda"
  32.    
  33.     Fichier = open(nom_fichier,'wb')
  34.     print "liste: "+str(nom_dico)
  35.     pickle.dump(agenda, Fichier)   # sérialisation
  36.     Fichier.close()
  37.     print
  38.    
  39. def ajout():
  40.     texte = "Ajout d'un contact dans le dictionnaire"
  41.     print texte
  42.     longueur_texte = len(texte)
  43.     print (longueur_texte * '-')
  44.     print
  45.    
  46.     #print('Entrez le nom : ')
  47.     #nom = raw_input()
  48.     #print('Entrez le prénom : ')
  49.     #prenom = raw_input()
  50.     #print("Entrez le n° de téléphone : " )
  51.     #tel = raw_input()
  52.     nom = "Moulin"
  53.     prenom = "Olivier"
  54.     tel = "0000000000"
  55.    
  56.     print "\nDico avant :"
  57.     print agenda
  58.     print
  59.    
  60.     agenda.append(nom)
  61.     agenda.append(prenom)
  62.     agenda.append(tel)
  63.     print "\nDico après :"
  64.     print agenda
  65.     print
  66.    
  67. def execute():
  68.     lecture_dico()
  69.     ajout()
  70.     #enregistre_dico()
  71.  
  72. execute()


 
Résultat :

Code :
  1. python /home/laurent/python/cours-python/dico-forum-hardware.py
  2. Chargement du dictionnaire em mémoire
  3. --------------------------------------
  4. [{'nom': 'dupond', 'prenom': 'jean', 'telephone': '0023659125'}, {'nom': 'dupond', 'prenom': 'steve', 'telephone': '00685432987'}]
  5. Ajout d'un contact dans le dictionnaire
  6. ---------------------------------------
  7. Dico avant :
  8. [{'nom': 'dupond', 'prenom': 'jean', 'telephone': '0023659125'}, {'nom': 'dupond', 'prenom': 'steve', 'telephone': '00685432987'}]
  9. Dico après :
  10. [{'nom': 'dupond', 'prenom': 'jean', 'telephone': '0023659125'}, {'nom': 'dupond', 'prenom': 'steve', 'telephone': '00685432987'}, 'moulin', 'olivier', '0000000000']
  11. laurent@Laurent-Bureau:~/python/cours-python$


 
Je ne sais pas comment ajouter les contacts correctement, car ceci n'est pas bon :

Code :
  1. [{'nom': 'dupond', 'prenom': 'jean', 'telephone': '0023659125'}, {'nom': 'dupond', 'prenom': 'steve', 'telephone': '00685432987'}, 'moulin', 'olivier', '0000000000']


Il faut l'enregistrer dans le dico comme ceci il me semble :

Code :
  1. [{'nom': 'dupond', 'prenom': 'jean', 'telephone': '0023659125'}, {'nom': 'dupond', 'prenom': 'steve', 'telephone': '00685432987'}, {'nom': 'moulin', 'prenom': 'oulivier', 'telephone': '0000000000'}]


 
Merci.


Message édité par xunil2003 le 02-03-2015 à 18:58:10
Reply

Marsh Posté le 02-03-2015 à 20:48:59    

Replace ceci:
 

Code :
  1. agenda.append(nom)
  2.     agenda.append(prenom)
  3.     agenda.append(tel)


 
Par:

Code :
  1. agenda.append({"nom": nom, "prenom": prenom, "telephone": tel})


 
Je te laisse chercher et comprendre pourquoi :jap:

Reply

Marsh Posté le 03-03-2015 à 17:10:25    

Bonjour,
 
Je n'ai pas très bien compris pour les modifications.

La modification se fait directement depuis un index donné.


Merci.

Reply

Marsh Posté le 04-03-2015 à 10:24:51    

Un index, c'est un int, exemple:
 

Code :
  1. c = []
  2. c.append({"nom": "ok"})
  3. c[0]["nom"] = "ok2"


 
Voila

Reply

Marsh Posté le 04-03-2015 à 13:37:50    

Bonjour,
 
C'est en quelque sorte le dico.
L'inconvénient c'est qu'il faut connaitre le n° de l'élément pour les modifier.
 
Avec ceci :

Code :
  1. >>> print agenda
  2. [{'nom': 'dupond', 'prenom': 'jean', 'telephone': '0023659125'}, {'nom': 'dupond', 'prenom': 'steve', 'telephone': '00685432987'}, {'nom': 'moulin', 'prenom': 'olivier', 'telephone': '0000000000'}]


 
Pour connaitre les n° des éléments

Code :
  1. >>> elem = len(agenda)
  2. >>> print elem
  3. 3
  4. >>>


 
Même avec une boucle for j'ai toujours le n°3.

Code :
  1. for agen in agenda:
  2. print agen['nom'], agen['prenom'], agen['telephone']
  3. elem = len(agen)
  4. print "ligne : ", elem


 
J'obtiens comme résultat :

Code :
  1. dupond jean 0023659125
  2. ligne : 3
  3. dupond steve 00685432987
  4. ligne : 3
  5. moulin olivier 0000000000
  6. ligne : 3


 
Je cherche à avoir un truc du genre :

Code :
  1. dupond jean 0023659125
  2. ligne : 1
  3. dupond steve 00685432987
  4. ligne : 2
  5. moulin olivier 0000000000
  6. ligne : 3


 
Ainsi pour modifier l'élément  concerné, je pourrais indiquer le numéro avec une variable à la place du [2] :

Code :
  1. c[2]["prenom"] = "ok2"


 
Comment puis-je faire ?
Maintenant peut-être que je me trompe est qu'il ne faut pas si prendre comme ça question développement.
Merci.

Message cité 1 fois
Message édité par xunil2003 le 04-03-2015 à 13:51:33
Reply

Marsh Posté le 04-03-2015 à 14:05:40    

xunil2003 a écrit :

Bonjour,

 

C'est en quelque sorte le dico.
L'inconvénient c'est qu'il faut connaitre le n° de l'élément pour les modifier.


Bah c'est logique, si c'est stocké dans une liste faut savoir quel élément de la liste tu veux modifier. Sinon il faut stocker ça dans un dictionnaire de dictionnaires (et connaître la clé) ou dans une DB.

 

Notes que tu peux aussi filtrer ta liste sur un critère arbitraire pour essayer de trouver un objet dedans, mais moins rapide (vu qu'il faut passer sur chaque objet pour savoir si c'est celui que tu veux)

xunil2003 a écrit :


Pour connaitre les n° des éléments

Code :
  1. >>> elem = len(agenda)
  2. >>> print elem
  3. 3
  4. >>>




Bah non, c'est n'importe quoi, len() ça donne la longueur de la liste, donc 3 vu que t'as 3 trucs dedans.

xunil2003 a écrit :


Même avec une boucle for j'ai toujours le n°3.

Code :
  1. for agen in agenda:
  2.     print agen['nom'], agen['prenom'], agen['telephone']
  3.     elem = len(agen)
  4.     print "ligne : ", elem
 

J'obtiens comme résultat :

dupond jean 0023659125
ligne : 3
dupond steve 00685432987
ligne : 3
moulin olivier 0000000000
ligne : 3




Normal, t'imprimes la longueur de la liste. Elle a aucune raison de changer.

xunil2003 a écrit :


Je cherche à avoir un truc du genre :

dupond jean 0023659125
ligne : 1
dupond steve 00685432987
ligne : 2
moulin olivier 0000000000
ligne : 3




Tu demandes à la liste quel est l'index de l'élément courant:

Code :
  1. for agen in agenda:
  2.    print agen['nom'], agen['prenom'], agen['telephone']
  3.    elem = agenda.index(agen)
  4.    print "ligne : ", elem


ou bien tu itères en demandant l'index actuel simultanément:

Code :
  1. for idx, agen in enumerate(agenda):
  2.    print agen['nom'], agen['prenom'], agen['telephone']
  3.    print "line:", idx


Message édité par masklinn le 04-03-2015 à 14:07:36

---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 04-03-2015 à 23:51:16    

Bonsoir,
 
J'ai voulu utiliser des variables

Code :
  1. ligne = 2
  2. champ = nom
  3. agenda['%s']['$d'] = valeur  % ligne, champ


au lien de  

Code :
  1. agenda['2']['nom'] = deschamps


afin de modifier l'élément comme une sorte de questionnaire.

Code :
  1. print "Ligne - Nom - Prénom - Téléphone"
  2. for idx, agen in enumerate(agenda):
  3.      print idx, agen['nom'], agen['prenom'], agen['telephone']
  4. print('Entrez le n° de la ligne à modifier : ')
  5. ligne = raw_input()
  6. print "\nVoici les champs :"
  7. for elements in agenda[0]:
  8.      print elements
  9.    
  10. print
  11. print('Entrez le nom du champ à modifier : ')
  12. champ = raw_input()
  13. print('Entrez la valeur à modifier dans le champ : ')
  14. valeur = raw_input()
  15. agenda['%s']['$d'] = valeur  % ligne, champ


 
Résultat :
 

Code :
  1. Ligne - Nom - Prénom - Téléphone
  2. 0 dupond jean 0023659125
  3. 1 dupond steve 00685432987
  4. 2 moulin olivier 0000000000
  5. Entrez le n° de la ligne à modifier :
  6. 2
  7. Voici les champs :
  8. nom
  9. prenom
  10. telephone
  11. Entrez le nom du champ à modifier :
  12. nom
  13. Entrez la valeur à remplacer dans le champ :
  14. deschamps


Mais ça marche pas.
 
Commet puis-je faire ?
 
Merci.

Message cité 1 fois
Message édité par xunil2003 le 04-03-2015 à 23:58:25
Reply

Marsh Posté le 05-03-2015 à 09:55:41    

xunil2003 a écrit :

Commet puis-je faire ?

 

Merci.


Tu pourrais aller apprendre le python, parce-que là c'est du grand n'importe quoi.


Message édité par masklinn le 05-03-2015 à 09:56:07

---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 05-03-2015 à 09:55:41   

Reply

Marsh Posté le 05-03-2015 à 17:07:05    

Bonjour,
 
Je ne sais pas trop comment faire, au lieu de me répondre que c'est du n'importe quoi, expliquez-moi la procédure à suivre afin dit réaliser.
Oui j'apprends python, seul inconvénient je vois le prof une fois par mois.
Maintenant si vous voulez m'expliquer ce sera gentil de votre part, sinon tant pis.
 
Merci.

Reply

Marsh Posté le 05-03-2015 à 17:15:51    

xunil2003 a écrit :

Je ne sais pas trop comment faire, au lieu de me répondre que c'est du n'importe quoi, expliquez-moi la procédure à suivre afin dit réaliser.


C'est pas vraiment faisable, il manque les bases du langage là et je ne peux pas faire tes exercices pour toi.

xunil2003 a écrit :

Oui j'apprends python, seul inconvénient je vois le prof une fois par mois.


Tu es au courant qu'il y a de la documentation sur python sur l'internet mondial? https://docs.python.org/2/tutorial/ par exemple?


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed