2011-10-13 2 views
2

Je suis en train de décaper un objet patient en utilisant:Python Pickle Cédant EOF Erreur à la lecture et ne pas lire correctement

theFile = open(str(location)+str(filename)+'.pkl','wb') 
pickle.dump(self,theFile) 
theFile.close() 

Cela fonctionne bien et écrit avec succès dans le fichier comme vous le souhaitez. Mais! Lorsque j'essaie de charger les données du pouce, j'obtiens une erreur EOF XOR qui charge les anciennes données qui ne sont pas présentes dans le pouce. Je ne sais pas où ce vieux données vient, compte tenu de la cornichon contient toutes les données sauvegardées correctes ...

opération de chargement:

theFile = open('/media/SUPER/hr4e/thumb/patient.pkl','r+') 
self = pickle.load(theFile) 
theFile.close() 

Un exemple serait: je change un attribut de la objet désiré et enregistrez-le. L'attribut est clairement enregistré dans le fichier pickle, mais lorsque je recharge le fichier Pickle sur un autre ordinateur, il ne lit pas le pickle et charge les anciennes données. J'ai vérifié pour voir s'il lisait le cornichon et il est ...

Y at-il des nuances subtiles sur les cornichons qui me manquent? Ou, est-ce que j'utilise juste les mauvais arguments de lecture et d'écriture pour la sauvegarde et le chargement de cornichons?

Répondre

1

Affectation à l'intérieur d'une auto méthode met à jour seulement ce que les self variables points dans cette méthode; il ne met pas à jour l'objet lui-même. Pour le charger, renvoyez plutôt un objet nouvellement chargé à partir d'un classmethod ou d'une fonction. Essayez le code comme ceci:

import pickle 
class Patient(object): 
    def __init__(self, name): 
     self.name = name 

    def save(self, location, filename): 
     theFile = open(str(location)+str(filename)+'.pkl','wb') 
     pickle.dump(self,theFile) 
     theFile.close() 

    @classmethod 
    def load(cls, location, filename): 
     theFile = open(str(location)+str(filename)+'.pkl','rb') 
     m = pickle.load(theFile) 
     theFile.close() 
     return m 

p = Patient("Bob") 
print p.name 

# save the patient 
p.save("c:\\temp\\", "bob") 

# load the patient - this could be in a new session 
l = Patient.load("c:\\temp\\", "bob") 
print l.name 
0

Ouvrez le fichier en mode binaire. par exemple. theFile = open ('/ media/SUPER/hr4e/pouce/patient.pkl', 'r + b')

+0

Non, cela n'a pas fonctionné. Pour une raison quelconque, il tire l'instance de patient par défaut du pickle, au lieu de l'instance enregistrée. Les données dans le fichier de pickle sont correctes ... alors où est-ce que vous obtenez ces anciennes données? Ceci est contenu en haut du fichier Pickle: (ihr4e.views. – super

0

J'ai fini par décaper le dictionnaire d'attributs de l'objet. Cela a fonctionné beaucoup mieux. Exemple:

self.__dict__ = pickle.load(file('data/pickles/clinic.pkl','r+b'))