当前位置: 首页 > 面试题库 >

在Python中检查tarfile完整性

罗源
2023-03-14
问题内容

我正在将备份脚本从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(十六进制编辑器-编辑几个字节的中间文件)。第一个除外不捕获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的回答进行了小幅改进,使事情变得更加惯用(尽管我正在删除一些错误检查以使机制更明显):

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 not data:检查。另请注意,使用with限制将其限制为Python
2.7+



 类似资料:
  • 我目前正在创建一些自定义流,通过会话来回发送一些数据。我注意到在某些情况下(例如,如果一个响应者流有一个session.receive,但在发起者流结束时仍未得到响应),不会抛出异常,一切都很顺利,甚至没有警告日志。有没有办法强制检查发送/接收的完整性?

  • 问题内容: 我有一个有4000万行且没有主键的表。在添加主键之前,我想检查表中是否有重复的条目。当我说重复条目时,我不仅意味着在特定列上重复。我的意思是整行重复。 在上一个问题中,我被告知可以执行查询以确定重复项。我该怎么做? 我正在运行PostgreSQL 8.1.22。(通过运行获得此信息)。 问题答案: 要了解是否 任何 完整存在重复(在所有列相同),这可能是最快的方法: 这是一种非常方便的

  • 我是mySQL的新手,我想在我的数据库中添加一个完整性检查(或约束?对不起,我是意大利人)。让我解释一下:我有两张桌子 numPlaces表示车间所能承受的最大操作次数。我创建了一个触发器,每次在操作中插入一个新记录时,引用到该特定位置的Workshop的numOperations就会增加1。 现在我想做的是:当时,如果我尝试插入一个新记录到Operation,系统必须告诉我不能。基本上, 有没有

  • 我研发的App使用了一些JWT令牌,而不是它生成的。到目前为止,我存储令牌,并严格比较头中给出的令牌和我在数据库中得到的令牌。 我找到的所有JWT PHP库都按以下顺序显示示例: 使用密钥ky生成令牌 我需要检查JWT是否有效(关于标头、有效负载和给定的签名),这将增加一个安全层。 在没有密钥的情况下,我如何“简单”地检查令牌完整性?

  • 问题内容: 如何从当前执行的Python脚本中找到当前运行的Python解释器的完整路径? 问题答案: 包含当前运行的Python解释器的完整路径。

  • 问题内容: 如何检查变量是否为整数? 问题答案: 如果你需要这样做,请执行 除非你使用的是Python 2.x,否则需要 不要使用type。在Python中,这几乎永远不是正确的答案,因为它阻止了多态性的所有灵活性。例如,如果你子类化int,则你的新类应注册为int,但type不会这样做: 这符合Python强大的多态性:你应该允许行为类似于的任何对象int,而不是强制将其作为一个对象。 BUT