gpt4 book ai didi

使用 Pickler 时出现 Python Pickle EOFerror(但不使用 pickle.dump())

转载 作者:行者123 更新时间:2023-11-30 23:51:37 28 4
gpt4 key购买 nike

因此,我尝试使用 Python 的 pickle 将一些对象保存到 Windows 7 上的磁盘。我正在使用下面的代码,它在几乎任何任意对象上都会失败(saveobj 的内容并不重要,无论如何它都会失败)。下面是我的测试代码:

import pickle, os, time
outfile = "foo.pickle"
f = open(outfile, 'wb')
p = pickle.Pickler(f, -1)
saveobj = ( 2,3,4,5,["hat", {"mat": 6}])
p.save(saveobj)
#pickle.dump(saveobj, f)
print "done pickling"
f.close()
g = open(outfile, 'rb')
tup = pickle.load(g)
g.close()
print tup

当我运行它时,我得到以下输出/错误:

done pickling
Traceback (most recent call last):
File "C:\Users\user\pickletest2.py", line 13, in <module>
tup = pickle.load(g)
File "C:\Python26\lib\pickle.py", line 1370, in load
return Unpickler(file).load()
File "C:\Python26\lib\pickle.py", line 858, in load
dispatch[key](self)
File "C:\Python26\lib\pickle.py", line 880, in load_eof
raise EOFError
EOFError

但是,如果我使用 pickle.dump() 而不是 Pickler 对象,它就可以正常工作。我使用 Pickler 的原因是我想对其进行子类化,以便在 pickle 之前可以对每个对象执行操作。

有人知道为什么我的代码会这样做吗?我的搜索表明,没有“wb”和“rb”通常会导致这种情况,就像没有 f.close() 一样,但我两者都有。使用-1作为协议(protocol)有问题吗?我想保留它,因为它可以处理定义自己的 __slots__ 方法的对象,而无需定义 __getstate__ 方法。

最佳答案

Pickler.save() 是一个较低级别的方法,您不应该直接调用它。

如果您调用 p.dump(saveobj) 而不是 p.save(saveobj),它会按预期工作。

也许应该将其称为_save以避免混淆。但 dump 是文档中描述的方法,它与模块级 pickle.dump 完全匹配。

关于使用 Pickler 时出现 Python Pickle EOFerror(但不使用 pickle.dump()),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6617348/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com