[Python-ideas] tarfile.extractall progress

Tarek Ziadé tarek at ziade.org
Fri Sep 1 08:28:05 EDT 2017



On Fri, Sep 1, 2017, at 02:04 PM, Oleg Broytman wrote:
> Hi!
> 
> On Fri, Sep 01, 2017 at 01:50:13PM +0200, Tarek Ziad?? <tarek at ziade.org>
> wrote:
> > Hey,
> > 
> > For large archives, I want to display a progress bar while the archive
> > is being extracted with:
> > 
> > https://docs.python.org/3/library/tarfile.html#tarfile.TarFile.extractall
> > 
> > I could write my own version of extractall() to do this, or maybe we
> > could introduce a callback option that gets called
> > everytime .extract() is called in extractall()
> > 
> > The callback can receive the tarinfo object and where it's being
> > extracted. This is enough to plug a progress bar
> > and avoid reinventing .extractall()
> 
>    What is "where" here? I think it should be 2 parameters -- position
> in the file (in bytes) and total file size; the total could be None if
> the size is unknown (the tar is piped from network or a (g/bz)zip
> subprocess).

Interesting. In my mind, I was thinking about a high level callable that
would just let me count the files and directory that are being
extracted,

my hackish implementation with clint:

    with tarfile.open(file, "r:gz") as tar:
        size = len(list(tar))
        with progress.Bar(expected_size=size) as bar:
            def _extract(self, *args, **kw):
                bar.show(bar.last_progress + 1)
                return self.old(*args, **kw)

            tar.old = tar.extract
            tar.extract = functools.partial(_extract, tar)
            tar.extractall(profile_dir)

What I would expect to be able to do with the new option, something
like:

    with tarfile.open(file, "r:gz") as tar:
        size = len(list(tar))
        with progress.Bar(expected_size=size) as bar:
            def _progress(tarinfo):
                bar.show(bar.last_progress + 1)
            tar.extractall(profile_dir, onextracted=_progress)



> 
> > I can add a ticket and maybe a patch if people think this is a good
> > little enhancement
> 
>    Definitely a good idea!
> 
> > Cheers
> > Tarek
> > 
> > -- 
> > 
> > Tarek Ziad?? | coding: https://ziade.org | running: https://foule.es |
> > twitter: @tarek_ziade
> 
> Oleg.
> -- 
>      Oleg Broytman            http://phdru.name/           
>      phd at phdru.name
>            Programmers don't die, they just GOSUB without RETURN.
> _______________________________________________
> Python-ideas mailing list
> Python-ideas at python.org
> https://mail.python.org/mailman/listinfo/python-ideas
> Code of Conduct: http://python.org/psf/codeofconduct/


More information about the Python-ideas mailing list