Выходной файл tarfile для Python?
Я использую следующий код для извлечения tar файла:
import tarfile
tar = tarfile.open("sample.tar.gz")
tar.extractall()
tar.close()
Тем не менее, я хотел бы следить за прогрессом в виде того, какие файлы сейчас извлекаются. Как я могу это сделать?
ДОПОЛНИТЕЛЬНЫЕ БОНУСНЫЕ ТОЧКИ: возможно ли создать процент от процесса экстракции? Я хотел бы использовать это для tkinter для обновления индикатора выполнения. Спасибо!
Ответы
Ответ 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()