有什么方法可以检查文件是否是由创建的pickle
?我可以捕获抛出的异常,pickle.load
但没有特定的“不是泡菜文件”异常。
问问题
7991 次
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 回答