Sprawdzanie integralności plików tar w Pythonie

Pracuję nad przekształceniem mojego skryptu kopii zapasowej z powłoki na Python. Jedną z funkcji mojego starego skryptu było sprawdzenie utworzonego pliku tar pod kątem integralności, wykonując: gzip -t.

Wydaje się, że jest to trochę trudne w Pythonie.

Wydaje się, że jedynym sposobem, aby to zrobić, jest odczytanie każdego ze skompresowanych obiektów TarInfo w pliku tar.

Czy istnieje sposób na sprawdzenie integralności pliku tar, bez wyodrębniania na dysk lub przechowywania go w pamięci (w całości)?

Dobrzy ludzie na #python na freenode sugerowali, że powinienem czytać każdy fragment TarInfo po kawałku, odrzucając każdą przeczytaną porcję.

Muszę przyznać, że nie mam pojęcia, jak to zrobić, ponieważ właśnie uruchomiłem Pythona.

Wyobraź sobie, że mam plik tar o rozmiarze 30 GB, który zawiera pliki od 1 kb do 10 GB ...

To jest rozwiązanie, które zacząłem pisać:

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

Ten kod jest daleki od zakończenia. Nie odważyłbym się uruchomić tego na ogromnym archiwum tar 30 GB, ponieważ w pewnym momencie sprawdzenie byłoby obiektem 10 + GB (jeśli mam tak duże pliki w archiwum tar)

Bonus: Próbowałem ręcznie uszkodzić zero.tar.gz (edytor hex - edytuj kilka bajtów pliku pośredniego). Pierwszy z wyjątkiem nie łapie IOError ... Oto wyjście:

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

questionAnswers(3)

yourAnswerToTheQuestion