使用 Python 验证文件完整性
Verifying file integrity with Python
我有一个包含许多大文件的目录。它们都是用这行代码创建的:
pickle.dump(variable, gzip.open(file_name, 'wb'), -1)
所以它们基本上是压缩的、序列化的变量。
现在,在某个时候,在执行该行时,过去可能发生了 crash/interruption(或数次)。但是我只是不知道那是否发生过。
所以,首先,我假设如果发生意外情况,文件系统中有可能 file_name
已损坏,并且不(至少完全)包含压缩文件,序列化 variable
。我在这儿吗?
现在我想知道是否有一种方法可以检查这些文件的完整性而不必将它们一个一个地加载到内存中。我试图避免使用 try/except
.
执行 pickle.load(gzip.open(file_name, 'rb'))
这可能吗?是否有另一种(更快)的方法来检查 pickle
和 gzip
是否都成功完成?
虽然我认为除了解压缩之外无法检查 gzip 文件的有效性,pickled 数据协议包含一个 STOP
操作码,它应该出现在所有 pickled 的末尾数据。 (如果缺少,unpickling 将引发 EOFError
)。此停止操作码是 .
字符。因此,您可以通过检查 pickle 是否以 .
字符结尾来部分检查 pickle 的有效性。这也意味着您可以连接两个有效的 pickle,然后对结果进行两次 unpickling 将获得两个对象。协议二或更高版本中的所有 pickle 也以 \x80
(€
) 字符开头。
感谢 ,我找到了一个比将所有内容反序列化到内存中更快的解决方案。
f = gzip.open(file_name, 'rb')
f.seek(-1, os.SEEK_END)
f.read(1) == bytes('.', 'utf8')
注意:
- 如果压缩文件格式不正确(使用
try/except
),第二行可能会崩溃。
- 第三行是读取最后一个字节,应该是
.
.
我在python2.6中使用了下面的方法。
在 Python 2.7 中你可以使用 with as
try:
f = gzip.open(filepath, 'rb')
f._read_gzip_header()
return True
except Exception, e:
print e
return False
finally:
f.close()
我有一个包含许多大文件的目录。它们都是用这行代码创建的:
pickle.dump(variable, gzip.open(file_name, 'wb'), -1)
所以它们基本上是压缩的、序列化的变量。
现在,在某个时候,在执行该行时,过去可能发生了 crash/interruption(或数次)。但是我只是不知道那是否发生过。
所以,首先,我假设如果发生意外情况,文件系统中有可能 file_name
已损坏,并且不(至少完全)包含压缩文件,序列化 variable
。我在这儿吗?
现在我想知道是否有一种方法可以检查这些文件的完整性而不必将它们一个一个地加载到内存中。我试图避免使用 try/except
.
pickle.load(gzip.open(file_name, 'rb'))
这可能吗?是否有另一种(更快)的方法来检查 pickle
和 gzip
是否都成功完成?
虽然我认为除了解压缩之外无法检查 gzip 文件的有效性,pickled 数据协议包含一个 STOP
操作码,它应该出现在所有 pickled 的末尾数据。 (如果缺少,unpickling 将引发 EOFError
)。此停止操作码是 .
字符。因此,您可以通过检查 pickle 是否以 .
字符结尾来部分检查 pickle 的有效性。这也意味着您可以连接两个有效的 pickle,然后对结果进行两次 unpickling 将获得两个对象。协议二或更高版本中的所有 pickle 也以 \x80
(€
) 字符开头。
感谢
f = gzip.open(file_name, 'rb')
f.seek(-1, os.SEEK_END)
f.read(1) == bytes('.', 'utf8')
注意:
- 如果压缩文件格式不正确(使用
try/except
),第二行可能会崩溃。 - 第三行是读取最后一个字节,应该是
.
.
我在python2.6中使用了下面的方法。 在 Python 2.7 中你可以使用 with as
try:
f = gzip.open(filepath, 'rb')
f._read_gzip_header()
return True
except Exception, e:
print e
return False
finally:
f.close()