Search code examples
pythonpython-3.xprogress-bar

How to use progressbar module with urlretrieve


My pyhton3 script downloads a number of images over the internet using urlretrieve, and I'd like to add a progressbar with a completed percentage and download speed for each download.

The progressbar module seems like a good solution, but although I've looked through their examples, and example4 seems like the right thing, I still can't understand how to wrap it around the urlretrieve.

I guess I should add a third parameter:

urllib.request.urlretrieve('img_url', 'img_filename', some_progressbar_based_reporthook)

But how do I properly define it?


Solution

  • I think a better solution is to create a class that has all the needed state

    import progressbar
    
    class MyProgressBar():
        def __init__(self):
            self.pbar = None
    
        def __call__(self, block_num, block_size, total_size):
            if not self.pbar:
                self.pbar=progressbar.ProgressBar(maxval=total_size)
                self.pbar.start()
    
            downloaded = block_num * block_size
            if downloaded < total_size:
                self.pbar.update(downloaded)
            else:
                self.pbar.finish()
    

    and call :

    urllib.request.urlretrieve('img_url', 'img_filename', MyProgressBar())