English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Código para la función de barra de progreso en la consola de Python

El problema más importante de la barra de progreso es que todos los caracteres están en la misma línea y se pueden modificar.

Sin embargo, cuando se ejecuta la instrucción print, Python agrega '\n' al final de la impresión, es decir, un salto de línea, lo que hace que en la terminal una vez que se haya impreso con print, ya no se pueda modificar. Por lo tanto, nuestra salida ya no puede realizarse con print.

Vamos a usar la función sys.stdout.write() de la biblioteca sys, esta función escribe la cadena en la consola sin agregar ningún final, lo que significa que la salida aún no se ha completado. Al usar la función sys.stdout.flush(), podemos imprimir temporalmente la salida en la consola (creando la apariencia de print, por ahora llamémoslo salida falsa). Entonces, si usamos el carácter de escape 'r' (volver al inicio), todo parece mucho más razonable, ¿no?

Es decir: al imprimir la cadena, no se agrega '\n', y luego se devuelve al principio de la línea, lo que parece que se ha impreso, pero el cursor sigue en la posición original.

Un ejemplo

[Después de prueba, solo es efectivo ejecutarlo en la terminal de Linux, no hay efecto en la depuración de pycharm]

import sys, time
for i in range(5)
 sys.stdout.write('HELLO: %05d' % i)
 sys.stdout.flush()
 time.sleep(1)

Ejecutar este código en la terminal dará un efecto de barra de progreso simple.

A continuación, aún hay que resolver dos problemas:

Uno: Borrar el búfer

Algunos lectores inteligentes pueden notar que cuando la nueva cadena es más corta que la anterior, puede surgir un problema, como el siguiente fragmento de código:

import sys, time
for i in range(5)
 sys.stdout.write(str(i) * (5 - i) + '\r')
 sys.stdout.flush()
 time.sleep(1)

Al ejecutarlo, descubrimos que los resultados no son los que esperamos.

En realidad, esto se debe a que los caracteres que ya han sido enviados no se borran automáticamente, por lo que solo los nuevos se modifican. En cuanto a esto, mi solución actual es escribir una serie de espacios en blanco para borrar la cadena anterior y luego escribir de nuevo:

import sys, time
for i in range(5)
sys.stdout.write(' ') * 10 + '\r')
sys.stdout.flush()
sys.stdout.write(str(i) * (5 - i) + '\r')
sys.stdout.flush()
time.sleep(1)

Dos: Salida de borde inferior fijo

A veces, queremos que haya otras salidas mientras se carga la barra de progreso.

No dude en escribir la cadena necesaria después de borrar la salida anterior y luego simular la barra de progreso.

usando el siguiente código:

import sys, time
for i in range(5)
 sys.stdout.write(' ') * 10 + '\r')
 sys.stdout.flush()
 print i
 sys.stdout.write(str(i) * (5 - i) + '\r')
 sys.stdout.flush()
 time.sleep(1)

se puede completar la tarea necesaria.

¿cómo se siente, en realidad el principio es bastante simple, ¿no?

aquí se proporciona una clase implementada por mí para imprimir la barra de progreso:

import sys, time
class ProgressBar:
 def __init__(self, count = 0, total = 0, width = 50):
  self.count = count
  self.total = total
  self.width = width
 def move(self):
  self.count += 1
 def log(self, s):
  sys.stdout.write(' ') * (self.width + 9) + '\r')
  sys.stdout.flush()
  print s
  progress = self.width * self.count / self.total
  sys.stdout.write('{0:3}/{1:3}: '.format(self.count, self.total))
  sys.stdout.write('#' * progress + '-' * (self.width - progress) + '\r')
  if progress == self.width:
   sys.stdout.write('\n')
  sys.stdout.flush()
bar = ProgressBar(total = 10)
for i in range(10)
 bar.move()
 bar.log('We have arrived at: ') + str(i + 1))
 time.sleep(1)

El efecto es el siguiente:

De esta manera, se puede ver fácilmente el progreso de la ejecución del programa en algunas tareas, como los rastreadores, el aprendizaje automático y otros trabajos que no se sabe cuánto tiempo tomarán, también tendrán una idea de tiempo clara.

Este es todo el contenido que el editor comparte con usted sobre la implementación de la función de barra de progreso en la consola de Python, espero que sea útil para usted y que todos los apoyen al tutorial de grito.

Declaración: El contenido de este artículo se ha obtenido de la red, es propiedad del autor original, el contenido se ha subido por los usuarios de Internet de manera autónoma, este sitio no posee los derechos de propiedad, no se ha procesado editorialmente por humanos y no asume responsabilidad alguna por ellas. Si encuentra contenido sospechoso de copyright, por favor envíe un correo electrónico a: notice#oldtoolbag.com (al enviar un correo electrónico, reemplace # con @) para denunciar, y proporcione evidencia relevante. Una vez verificada, este sitio eliminará inmediatamente el contenido sospechoso de infracción.

Te gustará