Прогресс tar-файла Python

Есть ли какая-либо библиотека, показывающая прогресс при добавлении файлов в tar-архив в python, или, альтернативно, можно было бы расширить функциональность модуля tarfile для этого?

В идеальном мире я хотел бы показать общий прогресс создания tar, а также ожидаемое время его завершения.

Любая помощь в этом будет очень признательна.


person chakara    schedule 17.01.2011    source источник
comment
процент завершения = количество байтов на данный момент / общее количество байтов * 100%. время = размер / скорость. Это школьная математика.   -  person Ignacio Vazquez-Abrams    schedule 18.01.2011
comment
Проблема в том, как я могу получить байты так далеко от модуля tarfile. Когда я вызываю add и он начинает упаковывать файлы, как я узнаю, сколько байтов файла было добавлено?   -  person chakara    schedule 18.01.2011


Ответы (5)


К сожалению, не похоже, что есть простой способ получить байт по номерам байтов.

Вы добавляете действительно большие файлы в этот tar-файл? Если нет, я бы обновлял прогресс пофайлово, чтобы по мере добавления файлов в tar прогресс обновлялся в зависимости от размера каждого файла.

Предположим, что все ваши имена файлов находятся в переменной toadd, а tarfile является объектом TarFile. Как насчет,

from itertools import imap
from operator import attrgetter
# you may want to change this depending on how you want to update the
# file info for your tarobjs
tarobjs = imap(tarfile.getattrinfo, toadd)
total = sum(imap(attrgetter('size'), tarobjs))
complete = 0.0
for tarobj in tarobjs:
    sys.stdout.write("\rPercent Complete: {0:2.0d}%".format(complete))
    tarfile.add(tarobj)
    complete += tarobj.size / total * 100
sys.stdout.write("\rPercent Complete: {0:2.0d}%\n".format(complete))
sys.stdout.write("Job Done!")
person milkypostman    schedule 17.01.2011
comment
это должно быть tarfile.gettarinfo, а не tarfile.getattrinfo - person mingxiao; 17.01.2014

Найдите или напишите похожий на файл файл, который обертывает реальный файл, предоставляющий отчеты о ходе выполнения, и передайте его в Tarfile.addfile(), чтобы вы могли знать, сколько байтов было запрошено для включения в архив. Возможно, вам придется использовать/внедрить регулирование на случай, если Tarfile попытается сразу прочитать весь файл.

person Ignacio Vazquez-Abrams    schedule 17.01.2011

Недавно я написал библиотеку-оболочку, которая обеспечивает обратный вызов прогресса. Взгляните на это на git hub:

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

Не стесняйтесь обращаться за помощью, если вам это нужно.

person thomas    schedule 29.06.2011

Похоже, вы можете использовать параметр filter для tarfile.add()

with tarfile.open(<tarball path>, 'w') as tarball:
   tarball.add(<some file>, filter = my_filter)

def my_filter(tarinfo):
   #increment some count
   #add tarinfo.size to some byte counter
   return tarinfo

Вам доступна вся информация, которую вы можете получить от объекта TarInfo.

person mingxiao    schedule 16.01.2014

Как вы добавляете файлы в файл tar? Это через «добавить» с рекурсивным = True? Вы можете составить список файлов самостоятельно и вызывать «добавить» один за другим, показывая прогресс по мере продвижения. Если вы строите из потока/файла, то похоже, что вы можете обернуть этот fileobj, чтобы увидеть статус чтения и передать его в addfile.

Не похоже, что вам вообще нужно будет модифицировать tarfile.py.

person Andrew Dalke    schedule 17.01.2011