progreso - Python para imprimir la barra de estado y el porcentaje
python eventos (11)
Para implementar una barra de estado como a continuación:
[========== ] 45%
[================ ] 60%
[==========================] 100%
Quiero que esto se imprima en stdout y continúe actualizándolo, no imprima en otra línea. ¿Como hacer esto?
Aquí puede usar el siguiente código como una función:
def drawProgressBar(percent, barLen = 20):
sys.stdout.write("/r")
progress = ""
for i in range(barLen):
if i < int(barLen * percent):
progress += "="
else:
progress += " "
sys.stdout.write("[ %s ] %.2f%%" % (progress, percent * 100))
sys.stdout.flush()
El carácter ''/r''
(retorno de carro) restablece el cursor al comienzo de la línea y le permite escribir sobre lo que estaba previamente en la línea.
from time import sleep
import sys
for i in range(21):
sys.stdout.write(''/r'')
# the exact output you''re looking for:
sys.stdout.write("[%-20s] %d%%" % (''=''*i, 5*i))
sys.stdout.flush()
sleep(0.25)
No estoy 100% seguro de si esto es completamente portátil en todos los sistemas, pero funciona al menos en Linux y OSX.
En base a las respuestas anteriores y otras preguntas similares sobre la barra de progreso de CLI, creo que obtuve una respuesta común general para todas ellas. Verifíquelo en https://.com/a/15860757/2254146
Aquí hay una copia de la función, pero modificada para adaptarse a su estilo:
import time, sys
# update_progress() : Displays or updates a console progress bar
## Accepts a float between 0 and 1. Any int will be converted to a float.
## A value under 0 represents a ''halt''.
## A value at 1 or bigger represents 100%
def update_progress(progress):
barLength = 20 # Modify this to change the length of the progress bar
status = ""
if isinstance(progress, int):
progress = float(progress)
if not isinstance(progress, float):
progress = 0
status = "error: progress var must be float/r/n"
if progress < 0:
progress = 0
status = "Halt.../r/n"
if progress >= 1:
progress = 1
status = "Done.../r/n"
block = int(round(barLength*progress))
text = "/rPercent: [{0}] {1}% {2}".format( "="*block + " "*(barLength-block), progress*100, status)
sys.stdout.write(text)
sys.stdout.flush()
Parece
Porcentaje: [====================] 99.0%
Encontré la biblioteca útil tqdm ( tqdm , anteriormente: https://github.com/noamraph/tqdm ). Calcula automáticamente el tiempo de finalización y puede usarse como iterador.
Uso:
import tqdm
import time
for i in tqdm.tqdm(range(1000)):
time.sleep(0.01)
# or other long operations
Resultados en:
|####------| 450/1000 45% [elapsed: 00:04 left: 00:05, 99.15 iters/sec]
tqdm
puede envolver cualquier iterable.
Este es un enfoque bastante simple que se puede usar con cualquier ciclo.
#!/usr/bin/python
for i in range(100001):
s = ((i/5000)*''#'')+str(i)+('' %'')
print (''/r''+s),
Hay un módulo de Python que puede obtener de PyPI llamado progressbar
que implementa dicha funcionalidad. Si no te importa agregar una dependencia, es una buena solución. De lo contrario, vaya con una de las otras respuestas.
Un simple ejemplo de cómo usarlo:
import progressbar
from time import sleep
bar = progressbar.ProgressBar(maxval=20, /
widgets=[progressbar.Bar(''='', ''['', '']''), '' '', progressbar.Percentage()])
bar.start()
for i in xrange(20):
bar.update(i+1)
sleep(0.1)
bar.finish()
Para instalarlo, puede usar la easy_install progressbar
o la easy_install progressbar
pip install progressbar
si prefiere pip.
Me encontré con este hilo hoy y después de haber probado esta solución de Mark Rushakoff
from time import sleep
import sys
for i in range(21):
sys.stdout.write(''/r'')
# the exact output you''re looking for:
sys.stdout.write("[%-20s] %d%%" % (''=''*i, 5*i))
sys.stdout.flush()
sleep(0.25)
Puedo decir que esto funciona bien en W7-64 con Python 3.4.3 de 64 bits, pero solo en la consola nativa. Sin embargo, cuando se usa la consola integrada de spyder 3.0.0dev, los saltos de línea están todavía presentes. Como esto me tomó un tiempo para descifrarlo, me gustaría informar esta observación aquí.
Prueba PyProg. PyProg es una biblioteca de código abierto para que Python cree indicadores y barras de progreso súper personalizables.
Actualmente se encuentra en la versión 1.0.2; está alojado en Github y está disponible en PyPI (enlaces abajo). Es compatible con Python 3 y 2 y también se puede usar con Qt Console.
Es realmente fácil de usar. El siguiente código:
import pyprog
from time import sleep
# Create Object
prog = pyprog.ProgressBar(" ", " ", total=34, bar_length=26, complete_symbol="=", not_complete_symbol=" ", wrap_bar_prefix=" [", wrap_bar_suffix="] ", progress_explain="", progress_loc=pyprog.ProgressBar.PROGRESS_LOC_END)
# Update Progress Bar
prog.update()
for i in range(34):
# Do something
sleep(0.1)
# Set current status
prog.set_stat(i + 1)
# Update Progress Bar again
prog.update()
# Make the Progress Bar final
prog.end()
producirá exactamente lo que desea (¡incluso la longitud de la barra!):
[=========== ] 45%
[=============== ] 60%
[==========================] 100%
Para obtener más opciones para personalizar la barra de progreso, vaya a la página de Github de este sitio web.
De hecho, hice PyProg porque necesitaba una biblioteca de barra de progreso simple pero súper personalizable. Puedes instalarlo fácilmente con: pip install pyprog
.
PyProg Github: https://github.com/Bill13579/pyprog
PyPI: https://pypi.python.org/pypi/pyprog/
Puede usar /r
( retorno de carro ). Manifestación:
import sys
total = 10000000
point = total / 100
increment = total / 20
for i in xrange(total):
if(i % (5 * point) == 0):
sys.stdout.write("/r[" + "=" * (i / increment) + " " * ((total - i)/ increment) + "]" + str(i / point) + "%")
sys.stdout.flush()
Si está desarrollando una interfaz de línea de comando, le sugiero que eche un vistazo al click
que es muy agradable:
import click
import time
for filename in range(3):
with click.progressbar(range(100), fill_char=''='', empty_char='' '') as bar:
for user in bar:
time.sleep(0.01)
Aquí el resultado que obtienes:
$ python test.py
[====================================] 100%
[====================================] 100%
[========= ] 27%
Sobre la base de algunas de las respuestas aquí y en otras partes, he escrito esta sencilla función que muestra una barra de progreso y el tiempo restante estimado / estimado. Debería funcionar en la mayoría de las máquinas basadas en Unix.
import time
import sys
percent = 50.0
start = time.time()
draw_progress_bar(percent, start)
def draw_progress_bar(percent, start, barLen=20):
sys.stdout.write("/r")
progress = ""
for i in range(barLen):
if i < int(barLen * percent):
progress += "="
else:
progress += " "
elapsedTime = time.time() - start;
estimatedRemaining = int(elapsedTime * (1.0/percent) - elapsedTime)
if (percent == 1.0):
sys.stdout.write("[ %s ] %.1f%% Elapsed: %im %02is ETA: Done!/n" %
(progress, percent * 100, int(elapsedTime)/60, int(elapsedTime)%60))
sys.stdout.flush()
return
else:
sys.stdout.write("[ %s ] %.1f%% Elapsed: %im %02is ETA: %im%02is " %
(progress, percent * 100, int(elapsedTime)/60, int(elapsedTime)%60,
estimatedRemaining/60, estimatedRemaining%60))
sys.stdout.flush()
return