Python tarfile 进度

5
有没有库可以在Python中向tar归档添加文件时显示进度?或者说是否可以扩展tarfile模块的功能以实现此功能? 在理想情况下,我想显示tar创建的整体进度以及完成时间的预计。 非常感谢任何对此的帮助。

1
完成百分比 = 已传输字节数 / 总字节数 * 100%。时间 = 大小 / 速率。这是小学数学。 - Ignacio Vazquez-Abrams
1
问题是如何从tarfile模块中获取“到目前为止的字节数”。当我调用add并开始打包文件时,我如何知道已添加了多少字节的文件? - chakara
5个回答

阿里云服务器只需要99元/年,新老用户同享,点击查看详情
2

2

寻找或编写一个类似文件的东西,包装一个提供进度报告的真实文件,并将其传递给 Tarfile.addfile(),以便您知道有多少字节被请求并包含在归档中。如果Tarfile尝试一次读取整个文件,则可能需要使用/实现限流。


2

看起来你可以使用 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对象中获取的所有信息都可以使用。


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!")

应该是tarfile.gettarinfo而不是tarfile.getattrinfo。 - mingxiao

0
你是如何将文件添加到tar文件中的?是通过"add"且recursive=True吗?你可以自己建立文件列表,并一个接一个调用"add",并在进行时显示进度。如果你正在从流/文件构建,则看起来你可以包装该fileobj以查看读取状态,并将其传递给addfile。 看起来你不需要修改tarfile.py。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,