【问题标题】:How to test if a file has been created by pickle?如何测试文件是否已由pickle创建?
【发布时间】:2012-12-18 19:16:32
【问题描述】:

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

【问题讨论】:

  • 检查醋和莳萝的痕迹
  • 您是担心刚刚使用pickle.dump时文件是否已创建,还是担心使用pickle.load时文件是否存在?无论哪种情况,当您打开文件句柄以进行输出或输入时都会发生错误,而不是在实际的pickle 行中。
  • 我关心的不是文件是否存在,而是存在的文件是否是pickle创建的。
  • 感谢您提出这个问题。它启发了我最终看看泡菜文件实际上是什么。有几种协议(pickle 文件格式)——请参阅 PEP 307 (python.org/dev/peps/pep-0307)——第一个是 ASCII,随后是二进制,并进行了增量改进。协议 3 仅适用于 Python 3。据我所知,没有一个有 isfileapicklefile 类型检查,但有几个有用的 Unpickling 异常(正如@Ned-batchelder 在他的回答中所宣传的那样):docs.python.org/2/library/pickle.html#pickle.UnpicklingError
  • 听起来你在泡菜!

标签: python pickle


【解决方案1】:

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

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

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

更新

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

根据您的具体用法,您可能可以通过更复杂(并且超过一个字节)来补充它,因为在腌制对象的表示中超过 STOP 操作码的任何数据都将被忽略 [2].

[1]  Footnote [2] 在 Python 2 文档中。
[2]  @987654322@ 的文档,它也适用于 @987654323@,因为它目前在前者的条款。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2013-08-26
      • 2015-11-30
      • 1970-01-01
      • 2011-12-13
      • 2012-04-15
      • 1970-01-01
      • 1970-01-01
      • 2013-02-14
      • 1970-01-01
      相关资源
      最近更新 更多