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 :

Déserialiser une liste d'objets : la galère


Sujet :

Python

  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Réunion

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2011
    Messages : 36
    Par défaut Déserialiser une liste d'objets : la galère
    Bonjour , je désespère sur ce problème,j'arrive à sauvegarder A l'Intérieur d'une liste , des objets dont les attributs sont remplis grâce à un questionnaire (option 1 du menu).

    Par contre , ça ne marche pas pour afficher la liste de ces objets (option 2 du menu).
    J'ai passé beaucoup d'heures à me prendre la tête dessus , malgré quelques conseils volontaires mais néanmoins trop approximatifs pour mon niveau débutant :

    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
    91
    92
     
    # -*- coding: utf-8 -*-
    from os import system
    import pickle
    import os
     
    DicoJoueurs = {'pseudo':'' ,'pays':'', 'categorie':'', 'score':''}
    ListeJoueurs = []
    #------------------------------------------- Fonctions Autonomes sur dictionnaire
    def afficheDicoJoueurs(DicoJoueurs):
    	print (" \n  Voici le DicoJoueurs  mis à jour  :  ",DicoJoueurs)
    #------------------------------------------- class Joueur
    class Joueur:
    	def __init__(self, pseudo,pays,categorie,score):
     
    		self.pseudo = pseudo					        
    		self.pays = pays			
    		self.categorie = categorie	        
    		self.score = score
     
    	def montretoi(self, pseudo,pays,categorie,score):
    		print ("   \n Mes attributs =>  mon pseudo : {0} ;  mon pays : {1} ;  ma categorie :  {2};  mon score :  {3}  \n\n".format(self.pseudo,self.pays,self.categorie,self.score)) 
     
    	def tapInfo(self, pseudo,pays,categorie):
    		self.pseudo = input(" \n  Quel est ton pseudo ? ")
    		self.pays = input(" \n  Quel est ton pays ? ")
    		self.categorie = input(" \n  Quel est ta categorie ? ")
     
    	def remplirDicoJoueurs(self, pseudo,pays,categorie,score):
    		DicoJoueurs["pseudo"] = self.pseudo
    		DicoJoueurs["pays"] = self.pays
    		DicoJoueurs["categorie"] = self.categorie
    		DicoJoueurs["score"] = self.score
     
    	def __str__(self):
    		return "%s %s %s %s" % (self.pseudo, self.pays, self.categorie,self.score)
     
    	def savobj(self, pseudo,pays,categorie,score):
    		with open ('dataObj.bin', 'ab') as fichier:
    			mon_pickler = pickle.Pickler(fichier)
    			mon_pickler.dump(self)
    			print(" \n\n  l'objet est sauvegardé dans le fichier dataObj.bin ")
     
    	def loaddataObj(dataObj):
    		ls = []
    		with open(dataObj, "rb") as file:
    			try:
    				while True:
    					ls.append(pickle.load(file))
    			except EOFError:
    				pass
    		return ls			
    #-------------------------------------------  affichage du menu -----------------------
    class Menu:
    	def __init__(self):
    		self.choix_menu = 'choix_menu'
     
    	def afficher_menu(self):
    		print(" \n\n\n")
    		print("  1.    Creation d'un nouvel avatar \n")
    		print("  2.    voir les personnages existant\n")
    		print("  3.    Quitter")
    		print(" \n\n\n")
    #-------------------------------------------  entree clavier choix du menu -----------------------	
    	def choisir_menu(self): 
     
    		choix_menu = input(" Choisissez une action : --> ")
    		print(" vous avez choisi : ",choix_menu)
    		ferme = input("appuie pour fermer")
    		choix_menu = int(choix_menu)
     
    		if choix_menu == 1:
     
    			os.system('cls')
    			newJoueur = Joueur(0,0,0,0)
    			newJoueur.montretoi(newJoueur.pseudo,newJoueur.pays,newJoueur.categorie,newJoueur.score)
    			newJoueur.tapInfo(newJoueur.pseudo,newJoueur.pays,newJoueur.categorie)
    			print("  Prise en compte de la saisie...  ")
    			newJoueur.montretoi(newJoueur.pseudo,newJoueur.pays,newJoueur.categorie,newJoueur.score)
    			newJoueur.remplirDicoJoueurs(newJoueur.pseudo,newJoueur.pays,newJoueur.categorie,newJoueur.score)
    			afficheDicoJoueurs(DicoJoueurs)
    			ListeJoueurs.append(newJoueur)
    			print(" \n  On a aussi allongé ListeJoueurs pour accueuillir le dernier joueur arrivé :  {} ".format(ListeJoueurs[0]))
    			newJoueur.savobj(newJoueur.pseudo,newJoueur.pays,newJoueur.categorie,newJoueur.score)
     
    		if choix_menu == 2:
    			os.system('cls')
    			Joueur.loaddataObj(dataObj)
    #------------------------------------------- MAIN --------------------
    monmenu = Menu()
    monmenu.afficher_menu()
    monmenu.choisir_menu()
    Je pense que vu l'impasse , il y a plus d'une erreur ; il me faudrait plus qu'une devinette pour m'aider ici ...
    Merci d'avance en tout cas !

  2. #2
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Réunion

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2011
    Messages : 36
    Par défaut
    reglé!

  3. #3
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 830
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

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

    Informations forums :
    Inscription : Février 2006
    Messages : 12 830
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par buffalo974 Voir le message
    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
    	def savobj(self, pseudo,pays,categorie,score):
    		with open ('dataObj.bin', 'ab') as fichier:
    			mon_pickler = pickle.Pickler(fichier)
    			mon_pickler.dump(self)
    			print(" \n\n  l'objet est sauvegardé dans le fichier dataObj.bin ")
     
    	def loaddataObj(dataObj):
    		ls = []
    		with open(dataObj, "rb") as file:
    			try:
    				while True:
    					ls.append(pickle.load(file))
    			except EOFError:
    				pass
    		return ls
    Je pense que vu l'impasse , il y a plus d'une erreur ; il me faudrait plus qu'une devinette pour m'aider ici ...
    Merci d'avance en tout cas !
    Bonjour
    Dans savobj tu sérializes l'objet (accessoirement je ne vois pas à quoi servent les autres paramètres).
    Dans loaddataObj tu as oublié que le premier paramètre d'une méthode référence toujours l'objet. Toi tu t'en sers comme d'un fichier. Forcément ça ne peut pas fonctionner !!!
    Toutefois, effectivement puisque c'est une méthode dédiée à renvoyer tous les objets et non un seul en particulier, ça doit être alors une méthode statique (de classe).

    Ceci dit, quand on veut tester un truc, on crée un petit exemple minimaliste du truc jusqu'à ce que ça fonctionne. Ensuite et seulement ensuite on peut intégrer le truc dans son projet. Alors voici un petit exemple fonctionnel de ce que tu veux faire...
    Code python : 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
    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
     
    import cPickle						# Je le préfère car plus rapide
     
    class cObjet:
            @staticmethod                                   # Permet de définir une méthode de classe
    	def load(fic):
    		with open(fic, "rb") as fp:
    			try:
    				while True: yield cPickle.load(fp)
    			except EOFError:
    				pass
    			# try
    		# with
    		fp.close()
    	# load()
     
    	def __init__(self, nom, prenom, age):
    		self.__nom=nom
    		self.__prenom=prenom
    		self.__age=age
    	# __init__()
     
    	def save(self, fic):
    		fp=open (fic, 'ab')
    		cPickle.Pickler(fp).dump(self)
    		fp.close()
    	# save()
     
    	def __str__(self):
    		return "nom [%s], prenom [%s], age [%d]" % (
    			self.__nom,
    			self.__prenom,
    			self.__age,
    		)
    	# __str__()
    # class cObjet
     
    cObjet("xxx", "yyy", 123).save("fic.bin")
    cObjet("zzz", "ttt", 456).save("fic.bin")
    data=[x for x in cObjet.load("fic.bin")]
    print data, len(data)
    print
    print "\n".join("%s" % x for x in data)

    PS: évite de nommer tes variable "file" qui est déjà utilisé en natif dans Python
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  4. #4
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Réunion

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2011
    Messages : 36
    Par défaut
    merci sve@r

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 11/05/2006, 19h20
  2. Créer une liste d'objets statiques dans une classe
    Par crossbowman dans le forum C++
    Réponses: 3
    Dernier message: 13/03/2006, 09h11
  3. methode qui retourne une liste d'objets du meme type
    Par anoukhan dans le forum Oracle
    Réponses: 8
    Dernier message: 12/01/2006, 18h38
  4. Tri d'une liste d'objet CObList
    Par cjacquel dans le forum MFC
    Réponses: 1
    Dernier message: 13/07/2005, 13h50
  5. [MFC] Retourner une liste d'objets
    Par 1cado dans le forum MFC
    Réponses: 10
    Dernier message: 28/07/2003, 12h11

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