Пропускать поврежденные архивы (.tar.gz) при использовании tarfile - PullRequest
0 голосов
/ 12 января 2019

У меня есть более 100 файлов .tar.gz в папке. Некоторые из этих файлов повреждены.

Я пытаюсь извлечь их все. В случае поврежденного файла я хочу пропустить этот архив и перейти к следующему файлу. Кроме того, если возможно, в конце я хотел бы получить список архивов, которые не удалось извлечь.

import os
import tarfile
files = os.listdir('G:\\A')
for file in files:
    id = file.split('.')
    with tarfile.open('G:\\A\\' + file,'r:gz') as tar:
        tar.extractall(path='G:\\A\\Extracted\\' + id[0])

Цикл продолжается, как и ожидалось, однако, когда он встречает поврежденный архив, он выдает ошибку: «Сжатый файл завершился до того, как был достигнут маркер конца потока»

Edit: Согласно комментарию ILI, я попытался следовать, но получил ту же ошибку.

BLOCK_SIZE = 1024
for file in files:    
    with tarfile.open('G:\\Sat Img\\' + file) 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

1 Ответ

0 голосов
/ 12 января 2019

Если я правильно понимаю ваш вопрос, возможно, вы ищете модификацию, подобную этой:

import os
import tarfile
files = os.listdir('G:\\A')
for file in files:
    id = file.split('.')
    try:
        with tarfile.open('G:\\A\\' + file,'r:gz') as tar:
            tar.extractall(path='G:\\A\\Extracted\\' + id[0])
    except tarfile.ReadError:  # reading tarfile failed
        continue               # move on to the next one

Не уверен, как ваши файлы повреждены и какую ошибку вы увидите, поэтому вам может понадобиться поймать другое исключение.

...