2012-08-12 3 views
-1

Je suis en train d'essayer le module pickle et d'en apprendre les fonctions et les utilitaires. J'ai écrit ce petit bout de code, mais ça me pose des problèmes.Impossible de charger l'objet pickle à partir du fichier

import pickle 
myfile = open("C:\\Users\\The Folder\\databin.txt", 'r+') #databin.txt is completely blank 
class A: 
    def __init__ (self): 
     self.variable = 25 
     self.random = 55 
pickle.dump (A, myfile, -1) #HIGHEST_PROTOCOL 
pickle.load (myfile) 

J'obtiens alors l'erreur suivante:

Traceback (most recent call last): 
File "<pyshell#9>", line 1, in <module> 
pickle.load (myfile) 
File "C:\Python27\lib\pickle.py", line 1378, in load 
return Unpickler(file).load() 
File "C:\Python27\lib\pickle.py", line 858, in load 
dispatch[key](self) 
KeyError: '\x00' 
+0

Vous code n'a pas de sens, vous pouvez décaper uniquement des instances d'objets, mais pas directement une classe. –

Répondre

3

Vous auriez besoin de fermer le dossier, puis le rouvrir pour que de travailler; et utilisez le mode binaire pour ouvrir votre fichier.

Last but not least, cornichon peut stocker instances des classes seulement, et non les classes elles-mêmes:

filename = "C:\\Users\\The Folder\\databin.txt" 
with open(filename, 'wb') as myfile: 
    pickle.dump(A(), myfile, -1) #HIGHEST_PROTOCOL 
with open(filename, 'rb') as myfile: 
    pickle.load(myfile) 

Ici, je l'ai utilisé le fichier en tant que gestionnaire de contexte, il va fermer automatiquement lorsque le with suite est terminée.

0

Fondamentalement, ce que Martin dit est correct. Vous devez d'abord fermer le fichier, puis le rouvrir. Si ce n'est pas le cas, vous obtenez une erreur. J'utilise dill, au lieu de cornichon, donc je peux décaper la classe.

Python 3.3.5 (default, Mar 10 2014, 21:37:38) 
[GCC 4.2.1 Compatible Apple Clang 4.1 ((tags/Apple/clang-421.11.66))] on darwin 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import dill 
>>> myfile = open('pickle.pkl', 'rb+') 
>>> 
>>> class A: 
... def __init__(self): 
...  self.variable = 25 
...  self.random = 55 
... 
>>> dill.dump(A, myfile, 2) 
>>> dill.load(myfile) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/Users/mmckerns/lib/python3.3/site-packages/dill-0.2.2.dev-py3.3.egg/dill/dill.py", line 187, in load 
    obj = pik.load() 
    File "/opt/local/Library/Frameworks/Python.framework/Versions/3.3/lib/python3.3/pickle.py", line 847, in load 
    raise EOFError 
EOFError 

Maintenant, fermez le fichier et réessayez ... n'oubliez pas de le rouvrir en premier.

>>> myfile.close() 
>>> dill.load(myfile) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/Users/mmckerns/lib/python3.3/site-packages/dill-0.2.2.dev-py3.3.egg/dill/dill.py", line 187, in load 
    obj = pik.load() 
    File "/opt/local/Library/Frameworks/Python.framework/Versions/3.3/lib/python3.3/pickle.py", line 845, in load 
    key = read(1) 
ValueError: read of closed file 
>>> 
>>> myfile = open('pickle.pkl', 'rb+') 
>>> dill.load(myfile) 
<class '__main__.A'> 
Questions connexes