寻找或编写一个类似文件的东西,包装一个提供进度报告的真实文件,并将其传递给 Tarfile.addfile()
,以便您知道有多少字节被请求并包含在归档中。如果Tarfile
尝试一次读取整个文件,则可能需要使用/实现限流。
看起来你可以使用 tarfile.add()
的 filter
参数。
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
对象中获取的所有信息都可以使用。
很遗憾,似乎没有一种简单的方法可以获得逐字节的数字。
您是否正在向此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!")