使用Python验证文件完整性

时间:2015-11-26 12:00:21

标签: python gzip pickle

我有一个包含许多大文件的目录。它们都是用这行代码创建的:

file_name

所以它们基本上是压缩的,序列化的变量。

现在,在某些时候,执行该确切行时,可能在过去发生了崩溃/中断(或几次)。但是,我只是不知道是否发生了这种情况。

所以,首先,我假设如果发生意外事件,文件系统中有variable可能已损坏,并且(至少完全)不包含压缩的序列化{ {1}}。我在这儿吗?

现在我想知道是否有办法检查这些文件的完整性,而无需逐个将它们加载到内存中。我试图避免使用pickle.load(gzip.open(file_name, 'rb'))执行try/except

这可能吗?还有另一种(更快)的方法来检查picklegzip是否成功完成?

3 个答案:

答案 0 :(得分:2)

虽然我认为除了通过解压缩之前检查gzip文件的有效性是不可能的,但是pickle数据协议包含一个STOP操作码,该操作码应该出现在所有pickle数据的末尾。 (如果缺少,则unpickling会引发EOFError)。此停止操作码是.字符。因此,您可以通过检查它是否以.字符结尾来部分检查泡菜的有效性。这也意味着您可以连接两个有效的pickle,然后取消两次结果将得到两个对象。协议二或更高的所有泡菜也以\x80)字符开头。

答案 1 :(得分:2)

感谢@ppperry's answer,我发现了一种解决方案,它比将所有内容反序列化到内存中更快。

f = gzip.open(file_name, 'rb')
f.seek(-1, os.SEEK_END)
f.read(1) == bytes('.', 'utf8')

请注意:

  • 如果压缩文件格式不正确,则第二行可能会崩溃(使用try/except)。
  • 第三行是读取最后一个字节的行,应该是.

答案 2 :(得分:0)

我在python 2.6中使用以下方法。 在Python 2.7中,您可以使用 with

"ContentEncoding": null,
"ContentType": null,
"Data": [
{
  "Id": 1,
  "Name": "test guy",
  "Address": "20 Glover Avenue",
  "Email": "test@napower.com",
  "Postal": "06850"
}