我试图对 defaultdict()
进行序列化,但是失败了。正确的方法是什么?
pos = defaultdict(lambda: 0)
neg = defaultdict(lambda: 0)
countdata = self.getCountdata(pos, neg, totals)
cPickle.dump(countdata, open(CDATA_FILE, 'w'))
这将会得到:
Traceback (most recent call last):
File "sentiment_worker.py", line 146, in <module>
MyDict().gearman_worker.work()
File "sentiment_worker.py", line 28, in __init__
self.train()
File "sentiment_worker.py", line 91, in train
cPickle.dump(countdata, open(CDATA_FILE, 'w'))
File "/usr/lib/python2.7/copy_reg.py", line 70, in _reduce_ex
raise TypeError, "can't pickle %s objects" % base.__name__
TypeError: can't pickle function objects
当我尝试使用dill时:
import dill
dill.dumps(countdata, open(CDATA_FILE, 'w') )
这将会得到:
File "sentiment_worker.py", line 151, in <module>
if __name__ == '__main__':
File "sentiment_worker.py", line 29, in __init__
self.train()
File "sentiment_worker.py", line 96, in train
# cPickle.dump(countdata, open(CDATA_FILE, 'w'))
File "/usr/local/lib/python2.7/dist-packages/dill/dill.py", line 243, in dumps
dump(obj, file, protocol, byref, fmode, recurse)#, strictio)
File "/usr/local/lib/python2.7/dist-packages/dill/dill.py", line 204, in dump
pik = Pickler(file, protocol)
File "/usr/local/lib/python2.7/dist-packages/dill/dill.py", line 387, in __init__
StockPickler.__init__(self, *args, **kwds)
File "/usr/lib/python2.7/pickle.py", line 202, in __init__
raise ValueError("pickle protocol must be <= %d" % HIGHEST_PROTOCOL)
ValueError: pickle protocol must be <= 2
如何正确地对内容进行pickle和unpickle操作?
defaultdict(int)
呢? - timgebdill
的作者。你正在使用dumps
而不是dump
。因此,你的文件句柄被视为 pickle 协议。 - Mike McKerns