Me pregunto cómo podría crear uno de esos ingeniosos contadores de consola en Python como en ciertos programas C / C ++.
Tengo un bucle haciendo cosas y la salida actual está en las líneas de:
Doing thing 0
Doing thing 1
Doing thing 2
...
lo que sería mejor sería tener la última línea actualizada;
X things done.
He visto esto en varios programas de consola y me pregunto si / cómo haría esto en Python.
print
: stackoverflow.com/a/8436827/1959808curses
es una exageración (vea la respuesta aceptada).Respuestas:
Una solución fácil es escribir
"\r"
antes de la cadena y no agregar una nueva línea; si la cuerda nunca se acorta, esto es suficiente ...Un poco más sofisticada es una barra de progreso ... esto es algo que estoy usando:
Llamas
startProgress
pasando la descripción de la operación, luegoprogress(x)
dondex
está el porcentaje y finalmenteendProgress()
fuente
restic
,flatpak
) pueden actualizar varias líneas de salida de la consola. ¿Sabe por casualidad cómo se puede lograr esto?Una solución más elegante podría ser:
llamar a esta función con
value
yendvalue
, el resultado debe serNota: Versión de Python 2.x aquí .
fuente
En python 3 puede hacer esto para imprimir en la misma línea:
print('', end='\r')
Especialmente útil para realizar un seguimiento de la última actualización y el progreso.
También recomendaría tqdm desde aquí si uno quiere ver el progreso de un bucle. Imprime la iteración actual y las iteraciones totales como una barra de progresión con un tiempo esperado de finalización. Super útil y rápido. Funciona para python2 y python3.
fuente
La otra respuesta puede ser mejor, pero esto es lo que estaba haciendo. Primero, hice una función llamada progreso que imprime el carácter de retroceso:
Luego lo llamé en un bucle en mi función principal así:
Esto, por supuesto, borrará toda la línea, pero puedes jugar con ella para hacer exactamente lo que quieras. Terminé haciendo una barra de progreso usando este método.
fuente
Para cualquiera que se encuentre con esto años más tarde (como lo hice yo), modifiqué un poco los métodos del 6502 para permitir que la barra de progreso disminuya y aumente. Útil en un poco más de casos. ¡Gracias 6502 por una gran herramienta!
Básicamente, la única diferencia es que la línea completa de #s y -s se escribe cada vez que se llama a progress (x), y el cursor siempre se devuelve al inicio de la barra.
fuente
Si lo entendí bien (no estoy seguro), ¿desea imprimir usando
<CR>
y no<LR>
?Si es así, esto es posible, siempre que el terminal de la consola lo permita (se interrumpirá cuando la salida sea redirigida a un archivo).
fuente
Se puede hacer sin usar la biblioteca sys si miramos la
print()
funciónAquí está mi código:
fuente
Escribí esto hace un tiempo y estoy realmente feliz con él. Sientase libre de usarlo.
Toma un
index
ytotal
y opcionalmentetitle
obar_length
. Una vez hecho esto, reemplaza el reloj de arena con una marca de verificación.⏳ Calculating: [████░░░░░░░░░░░░░░░░░░░░░] 18.0% done
✅ Calculating: [█████████████████████████] 100.0% done
Incluí un ejemplo que se puede ejecutar para probarlo.
También tengo una versión con barra de progreso receptiva dependiendo del ancho del terminal que use
shutil.get_terminal_size()
si eso es de interés.fuente
Se agregó un poco más de funcionalidad al ejemplo de Aravind Voggu :
Ahora puede generar múltiples barras de progreso sin reemplazar la anterior.
También he agregado
name
como valor con un ancho fijo.fuente
El siguiente código contará el mensaje de 0 a 137 cada 0,3 segundos reemplazando el número anterior.
Número de símbolo al backstage = número de dígitos.
fuente