Python 无法从文件加载pickle对象

Python 无法从文件加载pickle对象,python,pickle,Python,Pickle,我只是在尝试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

我只是在尝试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'
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
pickle.load(myfile)
加载文件“C:\Python27\lib\pickle.py”,第1378行
返回Unpickler(file.load())
加载文件“C:\Python27\lib\pickle.py”,第858行
调度[键](自身)
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
套件时,它将自动关闭。

基本上,Martin所说的是正确的。您需要先关闭该文件,然后重新打开它。 如果你不这样做,你会得到一个错误。我使用的是dill而不是pickle,所以我可以对类进行pickle

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
Python 3.3.5(默认,2014年3月10日21:37:38)
达尔文的[GCC 4.2.1兼容Apple Clang 4.1((tags/Apple/Clang-421.11.66))]
有关详细信息,请键入“帮助”、“版权”、“信用证”或“许可证”。
>>>进口莳萝
>>>myfile=open('pickle.pkl','rb+'))
>>> 
>>>A类:
...   定义初始化(自):
...     self.variable=25
...     self.random=55
... 
>>>dill.dump(A,myfile,2)
>>>加载(myfile)
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
文件“/Users/mmckerns/lib/python3.3/site packages/dill-0.2.2.dev-py3.3.egg/dill/dill.py”,第187行,已加载
obj=pik.load()
加载文件“/opt/local/Library/Frameworks/Python.framework/Versions/3.3/lib/python3.3/pickle.py”,第847行
提高采收率
伊奥费罗
现在,关闭该文件,然后再试一次…记住先再次打开它

>>> 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'>
>myfile.close()
>>>加载(myfile)
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
文件“/Users/mmckerns/lib/python3.3/site packages/dill-0.2.2.dev-py3.3.egg/dill/dill.py”,第187行,已加载
obj=pik.load()
加载文件“/opt/local/Library/Frameworks/Python.framework/Versions/3.3/lib/python3.3/pickle.py”,第845行
键=读取(1)
ValueError:读取已关闭的文件
>>> 
>>>myfile=open('pickle.pkl','rb+'))
>>>加载(myfile)

您的代码没有意义,您只能pickle对象的实例,而不能直接pickle类。