Python文件进度输出?
我使用以下代码提取tar文件:Python文件进度输出?,python,tar,Python,Tar,我使用以下代码提取tar文件: import tarfile tar = tarfile.open("sample.tar.gz") tar.extractall() tar.close() 但是,我想随时关注当前提取文件的进度。我该怎么做 额外加分:是否也可以创建提取过程的百分比?我想用它来更新tkinter的进度条。谢谢 您可以使用而不是extractall-您可以在提取成员名称时打印它们。要获取成员列表,可以使用 可在此处找到文本progressbar库: Tkinter代码段:
import tarfile
tar = tarfile.open("sample.tar.gz")
tar.extractall()
tar.close()
但是,我想随时关注当前提取文件的进度。我该怎么做
额外加分:是否也可以创建提取过程的百分比?我想用它来更新tkinter的进度条。谢谢 您可以使用而不是extractall
-您可以在提取成员名称时打印它们。要获取成员列表,可以使用
可在此处找到文本progressbar库:
import io
import os
import tarfile
def get_file_progress_file_object_class(on_progress):
class FileProgressFileObject(tarfile.ExFileObject):
def read(self, size, *args):
on_progress(self.name, self.position, self.size)
return tarfile.ExFileObject.read(self, size, *args)
return FileProgressFileObject
class TestFileProgressFileObject(tarfile.ExFileObject):
def read(self, size, *args):
on_progress(self.name, self.position, self.size)
return tarfile.ExFileObject.read(self, size, *args)
class ProgressFileObject(io.FileIO):
def __init__(self, path, *args, **kwargs):
self._total_size = os.path.getsize(path)
io.FileIO.__init__(self, path, *args, **kwargs)
def read(self, size):
print("Overall process: %d of %d" %(self.tell(), self._total_size))
return io.FileIO.read(self, size)
def on_progress(filename, position, total_size):
print("%s: %d of %s" %(filename, position, total_size))
tarfile.TarFile.fileobject = get_file_progress_file_object_class(on_progress)
tar = tarfile.open(fileobj=ProgressFileObject("a.tgz"))
tar.extractall()
tar.close()
您可以在
extractall()
以tarfile.open(,'r')作为tarball的:
extractall(路径=,成员=跟踪进度(tarball))
def跟踪进度(成员):
对于成员中的成员:
#这将是正在提取的当前文件
屈服成员
member
是TarInfo
对象,请参阅所有可用的函数和属性这里有一个很酷的解决方案,它将tarfile模块替换为插入式替换,并允许您指定要更新的回调
根据评论更新要查看当前正在提取的文件,以下内容对我有用:
import tarfile
print "Extracting the contents of sample.tar.gz:"
tar = tarfile.open("sample.tar.gz")
for member_info in tar.getmembers():
print "- extracting: " + member_info.name
tar.extract(member_info)
tar.close()
您可以使用并打印正在提取的文件数的进度:
import tarfile
from tqdm import tqdm
# open your tar.gz file
with tarfile.open(name=path) as tar:
# Go over each member
for member in tqdm(iterable=tar.getmembers(), total=len(tar.getmembers())):
# Extract member
tar.extract(member=member)
查看代码“Excel”调用“提取”,因此不应该有速度惩罚。文档注释“提取())方法不需要处理几个提取问题。在大多数情况下,您应该考虑使用ExtualTo()方法。在不知道这些提取问题是什么的情况下,我很犹豫是否将
extract
换成extractall
。这仍然是一个蒙奇补丁:)
谢谢tokland,这很有效:)有没有办法获得整个提取过程的浮点值?更具体地说,有没有办法在开始提取过程之前获得未压缩的大小?@Mike:这被认为是monkeypatching吗?我假设tarfile.tarfile是模块的“public”类(没有下划线),fileobject是“public”类属性(同样没有下划线),您可以安全地使用它们。但我对Python在这方面的政策并不十分熟悉。@FLX。恐怕使用上面的代码无法获得字节粒度的总百分比。您可以有两个进度条:总体进度(文件粒度)和当前文件进度(字节粒度)。该库远未准备好生产,例如,未传递进度函数时使用未分配变量。。。将路径字符串传递给extractall失败,因为它需要一个tarinfo(虽然这两个选项都应该可以)来填写,在yield member
之后,您可以打印出名称或更新进度条。这似乎不应该起作用-成员是extractall的输入,而不是输出?我错过什么了吗?@O'Rooney我迟到了,但是是的。这就是为什么我们在那里放弃它们。缺省对于循环来说是简单的,我们的重写意味着我们在提取过程中也可以访问成员列表,缺点是确保我们不会错过任何成员现在落入我们的责任。
import tarfile
from tqdm import tqdm
# open your tar.gz file
with tarfile.open(name=path) as tar:
# Go over each member
for member in tqdm(iterable=tar.getmembers(), total=len(tar.getmembers())):
# Extract member
tar.extract(member=member)