如何创建一个损坏的pkl文件python

时间:2014-03-03 05:00:45

标签: python pickle

我正在创建一个将函数返回值缓存到pkl文件的库。但是,有时当我在写入pkl文件时终止程序时,我最终会遇到损坏的pkl文件(并非总是如此)。我正在设置库来处理这些损坏的文件(主要导致EOFError,但也可能导致IOError)。但是,我需要创建我知道已损坏的文件来测试它,并且终止程序的方法不一致。有没有其他方法可以写入pkl文件,并在我随后读取它时保证EOFError或IOError?

2 个答案:

答案 0 :(得分:1)

拿一堆旧的,腐败的咸菜并使用它们。如果你没有,可以采取一堆工作泡菜,准随机截断它们,看看当你尝试加载它们时会出错。或者,如果“损坏的”文件甚至不需要像有效的泡菜那样,那么你可以随意拆开你不希望工作的随机垃圾。例如,将键盘混搭并尝试取消结果。

请注意docs

  

pickle模块不是为了防止错误或安全   恶意构造的数据。切勿取消从中收到的数据   不受信任或未经认证的来源。

答案 1 :(得分:1)

简答:您不需要它们。

答案很长:有更好的方法可以解决这个问题,请看下面的内容。

好的,让我们首先分别理解每个例外:

  1. 只要解析器到达文件末尾,就会发生EOFError 没有完整的对象表示,因此无法重建 对象。

  2. IOError表示读取错误,可以删除文件或在此过程中撤消其权限。

  3. 现在,让我们制定一个测试策略。

    一个常见的习惯用法是使用可能随机抛出这些异常的方法来封装有问题的方法pickle.Pickler。这是一个例子:

    import pickle
    from random import random
    
    def chaos_pickle(obj, file, io_error_chance=0, eof_error_chance=0):
        if random < io_error_chance:
            raise IOError("Chaotic IOError")
    
        if random < eof_error_chance:
            raise EOFError("Chaotic EOFError")
    
        return pickle.Pickler(obj, file)
    

    使用此代替传统的pickle.Pickler可确保您的代码随机抛出两个异常(请注意,如果您将io_error_chance设置为1,则会引发警告,但它永远不会引发{ {1}}。

    这个技巧在模拟库(EOFError)中用于创建错误对象以进行测试时非常有用。

    享受!