Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python文件进度输出?_Python_Tar - Fatal编程技术网

Python文件进度输出?

Python文件进度输出?,python,tar,Python,Tar,我使用以下代码提取tar文件: import tarfile tar = tarfile.open("sample.tar.gz") tar.extractall() tar.close() 但是,我想随时关注当前提取文件的进度。我该怎么做 额外加分:是否也可以创建提取过程的百分比?我想用它来更新tkinter的进度条。谢谢 您可以使用而不是extractall-您可以在提取成员名称时打印它们。要获取成员列表,可以使用 可在此处找到文本progressbar库: Tkinter代码段:

我使用以下代码提取tar文件:

import tarfile
tar = tarfile.open("sample.tar.gz")
tar.extractall()
tar.close()
但是,我想随时关注当前提取文件的进度。我该怎么做

额外加分:是否也可以创建提取过程的百分比?我想用它来更新tkinter的进度条。谢谢

您可以使用而不是
extractall
-您可以在提取成员名称时打印它们。要获取成员列表,可以使用

可在此处找到文本progressbar库:

Tkinter代码段:


文件进度和全局进度:

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)