检查Python中的tarfile完整性
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了检查Python中的tarfile完整性,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2155字,纯文字阅读大概需要4分钟。
内容图文
我正在努力将我的备份脚本从shell转换为Python.我的旧脚本的一个功能是通过执行以下操作来检查创建的tarfile的完整性:gzip -t.
这在Python中似乎有点棘手.
似乎唯一的方法是通过读取tarfile中的每个压缩的TarInfo对象.
有没有办法检查tarfile的完整性,无需提取到磁盘,或将其保存在内存中(完整地)?
freenode上#python上的好人建议我应该逐块读取每个TarInfo对象,丢弃每个块读取.
我必须承认,我不知道如何做到这一点,因为我刚刚开始使用Python.
想象一下,我有一个30GB的tarfile,其中包含1kb到10GB的文件……
这是我开始编写的解决方案:
try:
tardude = tarfile.open("zero.tar.gz")
except:
print "There was an error opening tarfile. The file might be corrupt or missing."
for member_info in tardude.getmembers():
try:
check = tardude.extractfile(member_info.name)
except:
print "File: %r is corrupt." % member_info.name
tardude.close()
这段代码远未完成.我不敢在巨大的30GB tar存档上运行它,因为在某一点上,检查将是10 GB的对象(如果我在tar存档中有这么大的文件)
奖金:
我试过手动破坏zero.tar.gz(十六进制编辑器 – 编辑几个字节midfile).第一个除了没有捕获IOError …这是输出:
Traceback (most recent call last):
File "./test.py", line 31, in <module>
for member_info in tardude.getmembers():
File "/usr/lib/python2.7/tarfile.py", line 1805, in getmembers
self._load() # all members, we first have to
File "/usr/lib/python2.7/tarfile.py", line 2380, in _load
tarinfo = self.next()
File "/usr/lib/python2.7/tarfile.py", line 2315, in next
self.fileobj.seek(self.offset)
File "/usr/lib/python2.7/gzip.py", line 429, in seek
self.read(1024)
File "/usr/lib/python2.7/gzip.py", line 256, in read
self._read(readsize)
File "/usr/lib/python2.7/gzip.py", line 320, in _read
self._read_eof()
File "/usr/lib/python2.7/gzip.py", line 342, in _read_eof
hex(self.crc)))
IOError: CRC check failed 0xe5384b87 != 0xdfe91e1L
解决方法:
只是对Aya’s答案的一个小改进,使事情变得更加惯用(尽管我正在删除一些错误检查以使机制更加明显):
BLOCK_SIZE = 1024
with tarfile.open("zero.tar.gz") as tardude:
for member in tardude.getmembers():
with tardude.extractfile(member.name) as target:
for chunk in iter(lambda: target.read(BLOCK_SIZE), b''):
pass
这实际上只是删除了while 1 :(有时被认为是次要代码气味)和if if not data:check.另请注意,使用with将此限制为Python 2.7
内容总结
以上是互联网集市为您收集整理的检查Python中的tarfile完整性全部内容,希望文章能够帮你解决检查Python中的tarfile完整性所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。