Python tarfile прогресс - PullRequest
       9

Python tarfile прогресс

4 голосов
/ 18 января 2011

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

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

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

Ответы [ 5 ]

2 голосов
/ 16 января 2014

Похоже, что вы можете использовать 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.

2 голосов
/ 29 июня 2011

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

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

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

2 голосов
/ 18 января 2011

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

Вы добавляете действительно большие файлы в этот 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!")
2 голосов
/ 18 января 2011

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

0 голосов
/ 18 января 2011

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

Не похоже, что вам нужно будет изменить tarfile.py ввсе.

...