22

有什么方法可以检查文件是否是由创建的pickle?我可以捕获抛出的异常,pickle.load但没有特定的“不是泡菜文件”异常。

4

2 回答 2

13

Pickle 文件没有标题,因此没有标准的方法来识别它们,除非尝试解开一个文件并查看这样做时是否引发了任何异常。

您可以通过子类化模块中的Pickler()Unpickler()类来定义自己的增强协议,其中包含某种标头。pickle然而,这不能用更快的cPickle模块来完成,因为在其中,它们是工厂函数,不能被子类化[1]

一种更灵活的方法是定义您自己的独立类,这些类在其实现中使用这些模块中的任何一个模块中的相应Pickler()Unpickler()实例。

更新

所有泡菜文件的最后一个字节应该是pickle.STOP操作码,所以虽然没有标题,但实际上有一个非常小的预告片,这将是一个相对简单的检查。

根据您的确切用法,您可能能够通过更复杂的内容(并且超过一个字节)来补充它,因为任何经过STOP腌制对象表示中的操作码的数据都会被忽略[2]

[1] Python 2 文档中的  脚注 [2]
[2]  的文档pickle.loads(),它也适用于,pickle.load()因为它目前是根据前者实现的。
于 2012-12-18T21:45:23.903 回答
12

除了尝试解开它并捕获异常之外,没有其他确定的方法。

于 2012-12-18T19:24:49.010 回答