ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

检查Python中的tarfile完整性

2019-10-02 19:59:46  阅读:608  来源: 互联网

标签:tarfile python error-handling integrity


我正在努力将我的备份脚本从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

标签:tarfile,python,error-handling,integrity
来源: https://codeday.me/bug/20191002/1844212.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有