[英]Unable to load pickle object from file
我只是尝试使用pickle模块并学习其功能和实用程序。 我已经编写了这小段代码,但这给我带来了麻烦。
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)
然后,我得到以下错误:
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'
您需要先关闭文件,然后重新打开文件才能正常工作。 并使用二进制模式打开文件。
最后但并非最不重要的是,pickle只能存储类的实例 ,而不能存储类本身:
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)
在这里,我已将该文件用作上下文管理器,当退出with
套件时它将自动关闭。
马丁所说的基本上是正确的。 您需要先关闭文件,然后重新打开。 如果不这样做,则会出现错误。 我使用的是dill
而不是泡菜,所以我可以泡菜。
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
现在,关闭文件,然后重试...请记住先打开它。
>>> 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'>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.