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 如何保存对象?的主要内容,如果未能解决你的问题,请参考以下文章

python pickle

python中的pickle模块

Python中使用pickle持久化对象

Python pickle模块

Python列表/字典的保存与加载(pickle)

python数据持久存储:pickle模块的基本使用