如何在python中创建损坏的pkl文件

如何在python中创建损坏的pkl文件,python,pickle,Python,Pickle,我正在创建一个将函数返回值缓存到pkl文件的库。但是,有时当我在写入pkl文件时终止程序时,我会导致pkl文件损坏(并非总是如此)。我正在设置库来处理这些损坏的文件(这些文件主要导致EOFError,但也可能导致IOError错误)。但是,我需要创建我知道已损坏的文件来测试这一点,并且终止程序的方法不一致。有没有其他方法可以写入pkl文件,并保证在我随后读取它时出现EOFError或IOError?拿一堆旧的、损坏的pickle并使用它们。如果你没有,拿一堆正在工作的pickle,准随机地截断它

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

拿一堆旧的、损坏的pickle并使用它们。如果你没有,拿一堆正在工作的pickle,准随机地截断它们,看看当你试图加载它们时哪些会出错。或者,如果“损坏的”文件甚至不需要类似于有效的pickle,那么您可以随意解开您不希望工作的垃圾。例如,捣碎键盘并尝试取消勾选结果

请注意

pickle
模块的目的不是为了防止错误或损坏 恶意构造的数据。从不解除从服务器接收的ICKICK数据 不可信或未经验证的来源


简短回答:你不需要它们

详细回答:有更好的方法处理这个问题,请看下面

好的,让我们从分别理解这些异常开始:

  • 每当解析器到达文件末尾时,就会发生EOFError 没有对象的完整表示,因此无法重建 物体

  • IOError表示读取错误,在此过程中可能会删除该文件或吊销其权限

  • 现在,让我们制定一个测试策略

    一个常见的习惯用法是用一个可能随机抛出这些异常的方法封装有问题的方法,
    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
    从随机导入随机
    def混沌\u pickle(对象、文件、io\u错误\u机会=0、eof\u错误\u机会=0):
    如果随机
    使用它而不是传统的
    pickle.Pickler
    可以确保您的代码随机抛出两个异常(请注意,有一个警告,但是,如果您将
    io\u error\u chance
    设置为1,它将永远不会引发
    EOFError

    当在模拟库(
    unittest.mock
    )中使用此技巧来创建用于测试目的的错误对象时,此技巧非常有用


    享受!

    你所说的“腐败”到底是什么意思?正如我所说的,保证(每种情况下分开)读取时生成EOFError或IOError。只需尝试从不存在的文件中加载
    。我希望它在检测到损坏的文件后删除这些文件,并确保它们正常工作。我现在没有,我在写入之前删除了它们。这是否意味着我需要在写入fil时终止你也可以将一个字符串进行pickle,将字符串切成两半,然后看看结果是否是无效的pickle,或者甚至只是尝试解pickle随机垃圾,比如
    apoiweroapwhoqiw
    或GIFs。我相信错误实际上来自
    pickle
    本身,而不是文件尝试取消勾选一个截断的pickle,我得到的
    eoferor
    来自
    pickle
    模块中的
    load\u eof
    。您好!同样的策略也适用,您可以将
    pickle
    打包(或任何函数/方法)随机抛出异常并确保您的代码能够很好地处理它们。这是一个非常常见的Python测试方法。EOFError表示“流意外结束”,它真的不在乎它是字符串、文件还是其他任何东西。IOError表示“在有效EOF之前,我无法读取您给我的描述符”。