todos progreso para impacientes eventos espaƱol blog barra python

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