我有一个包含许多大文件的目录。它们都是用这行代码创建的:
file_name
所以它们基本上是压缩的,序列化的变量。
现在,在某些时候,执行该确切行时,可能在过去发生了崩溃/中断(或几次)。但是,我只是不知道是否发生了这种情况。
所以,首先,我假设如果发生意外事件,文件系统中有variable
可能已损坏,并且(至少完全)不包含压缩的序列化{ {1}}。我在这儿吗?
现在我想知道是否有办法检查这些文件的完整性,而无需逐个将它们加载到内存中。我试图避免使用pickle.load(gzip.open(file_name, 'rb'))
执行try/except
。
这可能吗?还有另一种(更快)的方法来检查pickle
和gzip
是否成功完成?
答案 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"
}