Escribí una aplicación de consola simple para cargar y descargar archivos desde un servidor FTP usando ftplib.
Me gustaría que la aplicación muestre cierta visualización de su progreso de descarga / carga para el usuario; cada vez que se descarga un fragmento de datos, me gustaría que proporcione una actualización de progreso, incluso si es solo una representación numérica como un porcentaje.
Es importante destacar que quiero evitar borrar todo el texto que se ha impreso en la consola en líneas anteriores (es decir, no quiero "borrar" todo el terminal mientras imprimo el progreso actualizado).
Esto parece una tarea bastante común: ¿cómo puedo hacer una barra de progreso o una visualización similar que salga a mi consola mientras se preserva la salida anterior del programa?
Respuestas:
Una barra de progreso simple y personalizable
Aquí hay un agregado de muchas de las respuestas a continuación que uso regularmente (no se requieren importaciones)
Nota: Esto es para Python 3; vea los comentarios para obtener detalles sobre el uso de esto en Python 2.
Uso de muestra
Salida de muestra:
Actualizar
Hubo discusión en los comentarios sobre una opción que permite que la barra de progreso se ajuste dinámicamente al ancho de la ventana del terminal. Si bien no recomiendo esto, aquí hay una idea general que implementa esta característica (y toma nota de las advertencias).
fuente
# Size of terminal rows, columns = [int(x) for x in os.popen('stty size', 'r').read().split()]
columns
debería pasarse a la longitud para ajustar el tamaño de la barra de progreso a la ventana del terminal. Aunque la longitud de la parte progresiva de la barra debe reducirse (por la longitud del prefijo, sufijo, porcentaje y caracteres adicionales en esta cadena'\r%s |%s| %s%% %s'
end = '\r'
aend = ''
.Escribir '\ r' moverá el cursor de regreso al comienzo de la línea.
Esto muestra un contador de porcentaje:
fuente
99%
print
tiene unend
argumento: stackoverflow.com/a/8436827/1959808print
también tiene unflush
argumento: docs.python.org/3/library/functions.html#printtqdm: agrega un medidor de progreso a tus bucles en un segundo :
fuente
Escribe un
\r
a la consola. Es un "retorno de carro" que hace que todo el texto después de que se repita al comienzo de la línea. Algo como:que te dará algo como:
[ ########## ] 100%
fuente
\r
y luego escriba toda la línea nuevamente. Básicamente: ¿print("\rProgress: [{0:50s}] {1:.1f}%".format('#' * int(amtDone * 50), amtDone * 100))
dóndeamtDone
hay un flotador entre 0 y 1.sys.stdout.write
queprint
. Conprint
tengo nuevas líneas.,
al final de losprint
trabajos para mí.print("\rProgress: [{0:50s}] {1:.1f}%".format('#' * int(workdone * 50), workdone*100), end="", flush=True)
dondeworkdone
es un flotante entre 0 y 1, por ejemplo,workdone = parsed_dirs/total_dirs
Tiene menos de 10 líneas de código.
La esencia aquí: https://gist.github.com/vladignatyev/06860ec2040cb497f0f3
fuente
Pruebe la biblioteca de clics escrita por el Mozart de Python, Armin Ronacher.
Para crear una barra de progreso simple:
Esto es lo que parece:
Personaliza a tu gusto el contenido:
Aspecto personalizado:
Incluso hay más opciones, consulte los documentos de la API :
fuente
Me doy cuenta de que llego tarde al juego, pero aquí hay un poco de estilo Yum (Red Hat) que escribí (no con una precisión del 100% aquí, pero si estás usando una barra de progreso para ese nivel de precisión, entonces tú estás equivocado de todos modos):
Debería producir algo parecido a esto:
... donde los soportes permanecen estacionarios y solo aumentan los hash.
Esto podría funcionar mejor como decorador. Para otro día...
fuente
Mira esta biblioteca: clint
tiene muchas características, incluida una barra de progreso:
este enlace proporciona una descripción general rápida de sus características
fuente
Aquí hay un buen ejemplo de una barra de progreso escrita en Python: http://nadiana.com/animated-terminal-progress-bar-in-pythonPero si quieres escribirlo tú mismo. Podrías usar el
curses
módulo para facilitar las cosas :)[editar] Quizás más fácil no es la palabra para maldiciones. Pero si quieres crear un cui completo, las maldiciones se encargan de muchas cosas por ti.
[editar] Dado que el enlace anterior está inactivo, he puesto mi propia versión de una barra de progreso de Python, obténgala aquí: https://github.com/WoLpH/python-progressbar
fuente
curses
? ¿Más fácil? Hmmm ....salida
[29%] ===================
fuente
y, solo para agregar a la pila, aquí hay un objeto que puedes usar
resultados en:
Esto se consideraría comúnmente como "exagerado", pero es útil cuando lo está usando mucho.
fuente
Instalar
tqdm
. (pip install tqdm
) Y usarlo de la siguiente manera:Esa es una barra de progreso de 10 segundos que generará algo como esto:
fuente
Ejecute esto en la línea de comandos de Python ( no en ningún entorno IDE o de desarrollo):
Funciona bien en mi sistema Windows.
fuente
Y muchos tutoriales esperando ser buscados en Google.
fuente
Estoy usando el progreso de reddit . Me gusta porque puede imprimir el progreso de cada elemento en una línea, y no debería borrar las impresiones del programa.
Editar: enlace fijo
fuente
Intenta instalar este paquete
pip install progressbar2
:barra de progreso github: https://github.com/WoLpH/python-progressbar
fuente
basado en las respuestas anteriores y otras preguntas similares sobre la barra de progreso de la CLI, creo que obtuve una respuesta común general a todas ellas. Compruébelo en https://stackoverflow.com/a/15860757/2254146
En resumen, el código es este:
Parece
Porcentaje: [##########] 99.0%
fuente
Recomiendo usar tqdm - https://pypi.python.org/pypi/tqdm - que simplifica la conversión de cualquier iterable o proceso en una barra de progreso, y maneja todos los problemas con los terminales necesarios.
De la documentación: "tqdm puede admitir fácilmente devoluciones de llamada / ganchos y actualizaciones manuales. Aquí hay un ejemplo con urllib"
fuente
Una solución muy simple es poner este código en su bucle:
Pon esto en el cuerpo (es decir, la parte superior) de tu archivo:
Pon esto en el cuerpo de tu bucle:
fuente
NOTA: si ejecuta esto en interepter interactivo obtendrá números adicionales impresos
fuente
lol, acabo de escribir una cosita completa para esto, aquí está el código, tenga en cuenta que no puede usar Unicode cuando hago bloque ascii, uso cp437
y lo llamas así
así se ve así
fuente
Con los excelentes consejos anteriores, calculo la barra de progreso.
Sin embargo, me gustaría señalar algunas deficiencias
Cada vez que se vacía la barra de progreso, comenzará en una nueva línea
así:
[] 0%
[#] 10%
[##] 20%
[###] 30%
2.El corchete ']' y el número de porcentaje en el lado derecho se desplazan a la derecha a medida que '###' se alarga.
3. Se producirá un error si la expresión 'progreso / 10' no puede devolver un número entero.
Y el siguiente código solucionará el problema anterior.
fuente
Código para la barra de progreso del terminal python
fuente
Escribí una barra de progreso simple:
como puede ver, tiene: longitud de barra, prefijo y sufijo, relleno, espacio, texto en barra al 100% (oncomp) y bordes
Aquí un ejemplo:
fuera en progreso:
fuera completo:
fuente
Reuniendo algunas de las ideas que encontré aquí, y sumando el tiempo estimado restante:
fuente
Para python 3:
fuente
Bueno, aquí hay un código que funciona y lo probé antes de publicar:
Pros:
Contras:
prog2 = prog/5
aprog2 = int(prog/5)
)fuente
Aquí está mi solución Python 3:
'\ b' es una barra invertida, para cada carácter en su cadena. Esto no funciona dentro de la ventana cmd de Windows.
fuente
función de Greenstick para 2.7:
fuente
La barra de progreso del módulo de Python es una buena opción. Aquí está mi código típico:
fuente