【发布时间】:2011-03-01 16:58:36
【问题描述】:
由于某种原因,我无法让 cPickle.load 处理 ZipFile.open() 返回的文件类型对象。 如果我在 ZipFile.open() 返回的文件类型对象上调用 read(),我可以使用 cPickle.loads。
示例 ....
import zipfile
import cPickle
# the data we want to store
some_data = {1: 'one', 2: 'two', 3: 'three'}
#
# create a zipped pickle file
#
zf = zipfile.ZipFile('zipped_pickle.zip', 'w', zipfile.ZIP_DEFLATED)
zf.writestr('data.pkl', cPickle.dumps(some_data))
zf.close()
#
# cPickle.loads works
#
zf = zipfile.ZipFile('zipped_pickle.zip', 'r')
sd1 = cPickle.loads(zf.open('data.pkl').read())
zf.close()
#
# cPickle.load doesn't work
#
zf = zipfile.ZipFile('zipped_pickle.zip', 'r')
sd2 = cPickle.load(zf.open('data.pkl'))
zf.close()
注意:我不想只压缩 pickle 文件,而是压缩许多其他类型的文件。这只是一个例子。
【问题讨论】:
-
你试过
import picklefork吗? :P -
试着告诉我们在这种情况下“不起作用”是什么意思;我们没有水晶球。
-
@John,复制并超越他给出的代码有多难?它在最后一个 sn-p 中得到一个
EOFError。 -
@Alex:一个人复制/粘贴回溯等的工作量远低于多个人将代码复制/粘贴到 Python 猜测版本的工作量
-
这里没有回溯(因为
cPickle是C 编码的),并且.open方法是在Python 2.6 中引入的——那么,猜测在哪里? (如果 OP 使用的是 2.7 - 仍然只是一个候选版本 - 或者仍然罕见的 Py3,我 would 肯定希望提及或标记;-)。不捍卫发布不完整信息的一般想法,但这个问题(具有简短、完整、独立的代码)方式高于 SO 平均水平,因此单独批评它对我来说似乎很不合适 - - 肯定会更好(提及 2.6.5 或任何特定版本,使用的操作系统,EOFError,...),但只是勉强。