簡體   English   中英

Python 使用 Pickler 時出現 Pickle EOFerror(但不使用 pickle.dump())

[英]Python Pickle EOFerror when using Pickler (but not with pickle.dump())

所以,我正在嘗試使用 Python 的 pickle 將一些對象保存到 Windows 7 上的磁盤。 我正在使用下面的代碼,它在幾乎任何任意 object 上都會失敗(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 object,它就可以正常工作。 我使用 Pickler 的原因是我想對它進行子類化,這樣我就可以在腌制之前對每個 object 執行操作。

有人知道為什么我的代碼會這樣做嗎? 我的搜索表明沒有'wb'和'rb'通常會導致這種情況,因為沒有f.close(),但我有這兩個。 使用 -1 作為協議有問題嗎? 我想保留它,因為它可以處理定義自己的__slots__方法的對象,而無需定義__getstate__方法。

Pickler.save()是一個較低級別的方法,您不應該直接調用它。

如果您調用p.dump(saveobj)而不是p.save(saveobj) ,它會按預期工作。

也許它應該被稱為_save以避免混淆。 但是dump是文檔中描述的方法,它與模塊級pickle.dump完美匹配。

一般來說,出於性能原因,最好使用 cPickle(因為 cPickle 是用 C 編寫的)。 無論如何,使用轉儲它工作得很好:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM