Проверка целостности tarfile в Python

Я работаю над преобразованием моего резервного скрипта из оболочки в Python. Одной из особенностей моего старого скрипта было проверить целостность созданного tarfile, выполнив: gzip -t.

Это кажется немного сложным в Python.

Кажется, что единственный способ сделать это - прочитать каждый из сжатых объектов TarInfo внутри tar-файла.

Есть ли способ проверить tar-файл на целостность, не извлекая на диск или не сохраняя его в памяти (полностью)?

Хорошие люди на #python на freenode предложили мне читать каждый объект TarInfo по частям, отбрасывая каждую прочитанную часть чанка.

Я должен признать, что понятия не имею, как это сделать, видя, что я только начал Python.

Представьте, что у меня есть tarfile 30 ГБ, который содержит файлы размером от 1 КБ до 10 ГБ ...

Это решение, которое я начал писать:

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()

Этот код далеко не закончен. Я бы не посмел запустить это на огромном архиве tar размером 30 ГБ, потому что в какой-то момент проверка была бы объектом размером 10+ ГБ (если у меня есть такие огромные файлы в архиве 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

Ответы на вопрос(3)

Ваш ответ на вопрос