Python:如何阅读pickle dump?

时间:2013-04-16 19:52:42

标签: python sql pickle

我有一个从朋友那里得到的泡菜转储,他让我读它:

f = open('file.pickle')
import pickle
l = pickle.loads(f.read())

但我得ImportErrorno module named sql.models

有人可以帮我理解发生了什么吗?

1 个答案:

答案 0 :(得分:5)

您缺少重建pickle对象所需的代码。

Pickles存储可以从中导入类的位置以及实例属性。仍需要原始模块来重新创建模块。来自documentation

  

请注意,函数(内置和用户定义)由“完全限定”的名称引用而非值引用。这意味着只有函数名称被腌制,以及定义函数的模块的名称。函数的代码或其任何函数属性都不会被pickle。因此,定义模块必须可以在unpickling环境中导入,并且模块必须包含命名对象,否则将引发异常。 [4]

     

类似地,类通过命名引用进行pickle,因此适用于unpickling环境中的相同限制。请注意,没有类的代码或数据被pickle,因此在以下示例中,类属性attr未在unpickling环境中恢复:

class Foo:
    attr = 'a class attr'

picklestring = pickle.dumps(Foo)
     

这些限制是为什么必须在模块的顶层定义可选择的函数和类。

换句话说,用于创建 pickle的原始数据包括至少一个源自名为sql.models的模块的自定义类的实例。

小心阅读任意泡菜,即使是朋友。 pickle只是一种重用任意Python结构的堆栈语言。您可以构建一个在您的计算机上生成秘密后门服务器的pickle,具有足够的决心和技能。 pickle文档明确警告您:

  

警告pickle模块无意对抗错误或恶意构造的数据。切勿取消从不受信任或未经身份验证的来源收到的数据。

即使对于有经验的开发人员,也有been a problem in the past