【问题标题】:storing 'object'存储“对象”
【发布时间】:2010-11-11 03:06:05
【问题描述】:

PyTables 是否支持存储 Python 对象? 像这样:

dtype = np.dtype([('Name', '|S2'), ('objValue', object)])
data = np.zeros(3, dtype)
file.createArray(box3,'complicated',data)

当然,我在尝试执行此操作时会出错... 如何正确存储对象数组?有可能吗? 谢谢

【问题讨论】:

    标签: python pytables


    【解决方案1】:

    您可以使用 Pytables 保存通用 Python 对象:

    >>> dtype = np.dtype([('Name', '|S2'), ('objValue', object)])
    >>> data = np.zeros(3, dtype)
    >>> file = tables.openFile('/tmp/test.h5', 'w')
    >>> myobjects = file.createVLArray(file.root, 'myobjects', tables.ObjectAtom())
    >>> myobjects.append(data)
    >>> myobjects[0]
    array([('', 0), ('', 0), ('', 0)], 
          dtype=[('Name', '|S2'), ('objValue', '|O8')])
    

    但是,这将在幕后使用 pickle(实际上是 cPickle),因此您将无法从其他语言访问这些对象(pickle 是一种仅由 Python 本身支持的序列化格式)。

    【讨论】:

      【解决方案2】:

      如果您想将复杂数据存储在相关库不支持的位置,请尝试使用 pickle 模块。

      【讨论】:

      • 很遗憾...谢谢您的回答
      • 请注意,pickle 具有隐式序列化格式的所有问题(即它可能是错误的),并且使用 pickle 读取内容可以执行任意代码(引入潜在的巨大安全漏洞)。
      • pickle 不擅长处理大数据,例如大型 numpy 数组。 joblib 包通过专门处理这些数组来解决这个问题。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-30
      • 2013-02-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多