Printing progress bars¶
Using tqdm
progress bars¶
Pooch uses tqdm to print a download progress
bar. This is turned off by default but can be enabled using
progressbar=True
in pooch.retrieve
:
fname = retrieve(
url="https://some-data-server.org/a-data-file.nc",
known_hash="md5:70e2afd3fd7e336ae478b1e740a5f08e",
progressbar=True,
)
The resulting progress bar will be printed to the standard error stream (STDERR) and should look something like this:
100%|█████████████████████████████████████████| 336/336 [...]
You can also do the same with pooch.Pooch.fetch
:
POOCH = pooch.create(
...
)
fname = POOCH.fetch(
"large-data-file.h5",
progressbar=True,
)
Alternatively, you can pass progressbar=True
directly into one of our
downloaders:
# Using fetch
fname = POOCH.fetch(
"large-data-file.h5",
downloader=pooch.HTTPDownloader(progressbar=True),
)
# Using retrieve
fname = retrieve(
url="https://some-data-server.org/a-data-file.nc",
known_hash="md5:70e2afd3fd7e336ae478b1e740a5f08e",
downloader=pooch.HTTPDownloader(progressbar=True),
)
Note
tqdm
is not installed by default with Pooch. You will have to install
it separately in order to use this feature.
Using custom progress bars¶
Note
At the moment, this feature is only available for
pooch.HTTPDownloader
.
Alternatively, you can pass an arbitrary object that behaves like a progress
that implements the update
, reset
, and close
methods:
update
should accept a single integer positional argument representing the current completion (in bytes).reset
andclose
do not take any argument besideself
.
The object must also have a total
attribute that can be set from outside
the class.
In other words, the custom progress bar needs to behave like a tqdm
progress bar.
Here’s a minimal working example of such a custom “progress display” class:
import sys
class MinimalProgressDisplay:
def __init__(self, total):
self.count = 0
self.total = total
def __repr__(self):
return str(self.count) + "/" + str(self.total)
def render(self):
print(f"\r{self}", file=sys.stderr, end="")
def update(self, i):
self.count = i
self.render()
def reset(self):
self.count = 0
def close(self):
print("", file=sys.stderr)
An instance of this class can now be passed to an HTTPDownloader
as:
# Assuming you have a pooch.Pooch instance setup
POOCH = pooch.create(
...
)
minimal_progress = MinimalProgressDisplay(total=None)
fname = POOCH.fetch(
"large-data-file.h5",
downloader=pooch.HTTPDownloader(progressbar=minimal_progress),
)