Подтвердить что ты не робот

Выходной файл tarfile для Python?

Я использую следующий код для извлечения tar файла:

import tarfile
tar = tarfile.open("sample.tar.gz")
tar.extractall()
tar.close()

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

ДОПОЛНИТЕЛЬНЫЕ БОНУСНЫЕ ТОЧКИ: возможно ли создать процент от процесса экстракции? Я хотел бы использовать это для tkinter для обновления индикатора выполнения. Спасибо!

4b9b3361

Ответ 1

Как прогресс файла, так и глобальный прогресс:

import tarfile
import io
import os

def get_file_progress_file_object_class(on_progress):
    class FileProgressFileObject(tarfile.ExFileObject):
        def read(self, size, *args):
          on_progress(self.name, self.position, self.size)
          return tarfile.ExFileObject.read(self, size, *args)
    return FileProgressFileObject

class TestFileProgressFileObject(tarfile.ExFileObject):
    def read(self, size, *args):
      on_progress(self.name, self.position, self.size)
      return tarfile.ExFileObject.read(self, size, *args)

class ProgressFileObject(io.FileIO):
    def __init__(self, path, *args, **kwargs):
        self._total_size = os.path.getsize(path)
        io.FileIO.__init__(self, path, *args, **kwargs)

    def read(self, size):
        print("Overall process: %d of %d" %(self.tell(), self._total_size))
        return io.FileIO.read(self, size)

def on_progress(filename, position, total_size):
    print("%s: %d of %s" %(filename, position, total_size))

tarfile.TarFile.fileobject = get_file_progress_file_object_class(on_progress)
tar = tarfile.open(fileobj=ProgressFileObject("a.tgz"))
tar.extractall()
tar.close()

Ответ 2

Вы можете указать параметр members в extractall()

with tarfile.open(<path>, 'r') as tarball:
   tarball.extractall(path=<some path>, members = track_progress(tarball))

def track_progress(members):
   for member in members:
      # this will be the current file being extracted
      yield member

member являются объектами TarInfo, см. все доступные функции и свойства здесь

Ответ 3

Вы можете использовать extract вместо extractall - вы сможете печатать имена членов при их извлечении. Чтобы получить список участников, вы можете использовать getmembers.

Текстовую библиотеку progressbar можно найти здесь:

Отрывок из Tkinter:

Ответ 4

Здесь есть классное решение, которое переопределяет модуль tarfile как замену для замены и позволяет указать обратный вызов для обновления.

https://github.com/thomaspurchas/tarfile-Progress-Reporter/

обновлено на основе комментария

Ответ 5

Чтобы узнать, какой файл в настоящее время извлекается, для меня работало следующее:

import tarfile

print "Extracting the contents of sample.tar.gz:"
tar = tarfile.open("sample.tar.gz")

for member_info in tar.getmembers():
    print "- extracting: " + member_info.name
    tar.extract(member_info)

tar.close()