2011-01-17 2 views
3

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

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

Любая помощь по этому вопросу была бы действительно оценена.

+1

percent complete = байт до сих пор/общее количество байтов * 100%. время = размер/скорость. Это классная математика. –

+1

Проблема в том, как я могу получить «байты до сих пор» из модуля tarfile. Когда я вызываю add и он начинает упаковывать файлы, как я могу узнать, сколько байтов файла было добавлено? – chakara

ответ

0

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

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

2

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

Вы добавляете действительно большие файлы в этот файл 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!") 
+0

его должен быть tarfile.gettarinfo не tarfile.getattrinfo – mingxiao

2

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

2

Недавно я написал библиотеку обертки, которая обеспечивает обратный вызов прогресса. Посмотрите на него на мерзавца хаба:

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

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

1

Похоже, вы можете использовать параметр 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 объекта доступен для вас filter.