Python pickle 如何保存对象?
Posted
技术标签:
【中文标题】Python pickle 如何保存对象?【英文标题】:How does Python pickle save objects? 【发布时间】:2015-08-05 16:31:05 【问题描述】:我想知道是否可以将具有多个值/属性的对象保存到一个泡菜文件中,还是必须单独保存每个值?这是我现在拥有的代码:
def __init__(self, id, targets, binaries):
self.id = id
self.targets = targets
self.binaries = binaries
with open('PI0_Electron_data.pickle', 'wb') as output:
pickle.dump(PiElectron, output)
为了更好地理解 id 是一个整数,目标和二进制文件都是 numpy 数组。我能否从这个单一的 pickle 文件中获取对象的 id、目标和二进制文件,还是必须创建三个 pickle 文件?另外我将如何从泡菜文件中提取数据?
【问题讨论】:
嗯,你试过时它是否适用于一个文件? 我现在正在尝试,但需要 30 分钟,因为有很多数据 它应该可以工作。使用 pickle.load 从文件中获取对象。 首先处理一个样本集。理解这个概念并转向你的真实数据集。 【参考方案1】:您的代码应如下所示:
>>> class Thing(object):
... def __init__(self, id, targets, binaries):
... self.id = id
... self.targets = targets
... self.binaries = binaries
...
>>> import numpy as np
>>> t = Thing(1, np.arange(3), np.arange(3,9,2))
>>>
>>> import dill
>>> with open('electron_data.pkl', 'w') as f:
... dill.dump(t, f)
...
>>>
我使用dill
为您提供更好的序列化...本质上,dill
可以轻松腌制类实例——以及大多数python 对象。然后,当您想要返回对象时,您需要load
。
Python 2.7.10 (default, May 25 2015, 13:16:30)
[GCC 4.2.1 Compatible Apple LLVM 5.1 (clang-503.0.40)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import dill
>>> with open('electron_data.pkl', 'r') as f:
... t = dill.load(f)
...
>>> t
<__main__.Thing object at 0x100394410>
>>> t.id
1
>>> t.targets
array([0, 1, 2])
>>> t.binaries
array([3, 5, 7])
>>>
>>> print dill.source.getsource(t.__class__)
class Thing(object):
def __init__(self, id, targets, binaries):
self.id = id
self.targets = targets
self.binaries = binaries
>>>
我希望这有助于回答您的问题……如果您的实际代码更复杂(我假设是这样),它应该仍然可以工作,除非有一个不可拾取的对象。
【讨论】:
比我希望的要好。谢谢 令人难以置信的包,迈克。您应该公开接受它是您自己编写的包。 干得好!在简要列出支持的功能之后,您能否确认/拒绝 dill.dump() 可以在 Figure() 上保存 aDataSET 图的状态完整 matplotlib 3D 视图 实例并允许在远程系统上流式传输 / 接收 / 恢复它,仍然可以通过鼠标交互 3D 查看 DataSET? 是的,这是我的包裹,谢谢。我无法确认每个matplotlib
对象都与dill
相匹配,但已经有多个团队努力确保有良好的覆盖范围。见:github.com/uqfoundation/dill/issues/4以上是关于Python pickle 如何保存对象?的主要内容,如果未能解决你的问题,请参考以下文章