如何在python中创建损坏的pkl文件
我正在创建一个将函数返回值缓存到pkl文件的库。但是,有时当我在写入pkl文件时终止程序时,我会导致pkl文件损坏(并非总是如此)。我正在设置库来处理这些损坏的文件(这些文件主要导致EOFError,但也可能导致IOError错误)。但是,我需要创建我知道已损坏的文件来测试这一点,并且终止程序的方法不一致。有没有其他方法可以写入pkl文件,并保证在我随后读取它时出现EOFError或IOError?拿一堆旧的、损坏的pickle并使用它们。如果你没有,拿一堆正在工作的pickle,准随机地截断它们,看看当你试图加载它们时哪些会出错。或者,如果“损坏的”文件甚至不需要类似于有效的pickle,那么您可以随意解开您不希望工作的垃圾。例如,捣碎键盘并尝试取消勾选结果 请注意如何在python中创建损坏的pkl文件,python,pickle,Python,Pickle,我正在创建一个将函数返回值缓存到pkl文件的库。但是,有时当我在写入pkl文件时终止程序时,我会导致pkl文件损坏(并非总是如此)。我正在设置库来处理这些损坏的文件(这些文件主要导致EOFError,但也可能导致IOError错误)。但是,我需要创建我知道已损坏的文件来测试这一点,并且终止程序的方法不一致。有没有其他方法可以写入pkl文件,并保证在我随后读取它时出现EOFError或IOError?拿一堆旧的、损坏的pickle并使用它们。如果你没有,拿一堆正在工作的pickle,准随机地截断它
pickle
模块的目的不是为了防止错误或损坏
恶意构造的数据。从不解除从服务器接收的ICKICK数据
不可信或未经验证的来源
简短回答:你不需要它们 详细回答:有更好的方法处理这个问题,请看下面 好的,让我们从分别理解这些异常开始:
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之前,我无法读取您给我的描述符”。