Solución:
Utilice la función de barras de progreso anidadas de tqdm, una biblioteca de barras de progreso muy personalizable y de sobrecarga extremadamente baja:
$ pip install -U tqdm
Luego:
from tqdm import tqdm
# from tqdm.auto import tqdm # notebook compatible
import time
for i1 in tqdm(range(5)):
for i2 in tqdm(range(300), leave=False):
# do something, e.g. sleep
time.sleep(0.01)
(Los leave=False
es opcional: se necesita para descartar las barras anidadas al finalizar).
También puedes usar from tqdm import trange
y luego reemplazar tqdm(range(...))
con trange(...)
. También puede hacer que funcione en un cuaderno.
Requeriría que mueva la posición del cursor. Te he escrito un truco para que lo hagas.
Este script se basa en el hecho de que el módulo de la barra de progreso asume que está en una línea nueva para dibujar la barra de progreso. Simplemente moviendo el cursor hacia arriba (usando el código de escape para “mover el cursor 1 fila hacia arriba”) y hacia abajo (solo usando una nueva línea. También podría usar un código de escape, pero la nueva línea es más fácil y más rápida), se puede mantener un progreso múltiple. barras.
import progressbar, time, sys
def up():
# My terminal breaks if we don't flush after the escape-code
sys.stdout.write('x1b[1A')
sys.stdout.flush()
def down():
# I could use 'x1b[1B' here, but newline is faster and easier
sys.stdout.write('n')
sys.stdout.flush()
# Total bar is at the bottom. Move down to draw it
down()
total = progressbar.ProgressBar(maxval=50)
total.start()
for i in range(1,51):
# Move back up to prepare for sub-bar
up()
# I make a new sub-bar for every iteration, thinking it could be things
# like "File progress", with total being total file progress.
sub = progressbar.ProgressBar(maxval=50)
sub.start()
for y in range(51):
sub.update(y)
time.sleep(0.005)
sub.finish()
# Update total - The sub-bar printed a newline on finish, so we already
# have focus on it
total.update(i)
total.finish()
Esto, por supuesto, es un poco complicado, pero hace el trabajo. Espero que te sea de utilidad.
Básicamente, solo quiero agregar a la respuesta de @ casper.dcl. En el caso ligeramente diferente, donde tiene dos bucles for anidados y solo desea una barra de progreso ÚNICA, puede hacer lo siguiente.
from tqdm import tqdm
import time
n = 5
m = 300
with tqdm(total=n * m) as pbar:
for i1 in tqdm(range(n)):
for i2 in tqdm(range(m)):
# do something, e.g. sleep
time.sleep(0.01)
pbar.update(1)
Sé que esa no era la pregunta, pero aún podría ser útil para algunas personas.