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

Código para a função de barra de progresso no console Python

O problema mais importante da barra de progresso é que todos os caracteres estão na mesma linha e podem ser modificados.

No entanto, quando a instrução print é executada, o python adiciona 'n' (nova linha) ao final da impressão, isso faz com que, no console, após ser impresso com print, não seja mais possível modificá-lo. Portanto, nossa saída não pode mais ser feita com print.

Vamos usar a função sys.stdout.write() da biblioteca sys, essa função escreve a string no console sem adicionar qualquer final, o que significa que a saída ainda não está completa. Com a função sys.stdout.flush(), podemos imprimir temporariamente a saída no console (criando a ilusão de print, vamos chamar isso de 'print falso'). Então, se usarmos o caractere de escape 'r' (voltar ao início), tudo parece mais razoável, não é?

Isso é, ao imprimir a string, não adicionamos 'n' (nova linha), e fazemos o cursor voltar ao início da linha, então mostra o buffer atual, o que parece como um print, mas neste momento o cursor ainda está na posição original.

Um exemplo

[Testado, funciona apenas no terminal Linux, a saída de depuração no pycharm não tem efeito]

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

Executar este código no terminal resultará em um efeito simples da barra de progresso.

A seguir, precisamos resolver dois problemas:

Um: Limpar o buffer

Alguns leitores inteligentes podem notar que há problemas quando a nova string é mais curta do que a anterior, por exemplo, o seguinte código:

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

Depois de executar, o resultado não é tão diferente do que esperávamos.

Na verdade, é porque os caracteres que já foram flushados não são limpos automaticamente, então apenas os novos que são escritos são modificados. Em relação a isso, minha solução atual é primeiro escrever uma série de espaços para esvaziar a string anterior e escrever novamente:

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)

Dois: Saída de borda inferior fixa

Às vezes, queremos que a barra de progresso carregue enquanto há outras saídas.

Vamos tentar escrever a string necessária após limpar a última saída e simular a barra de progresso.

Usando o seguinte 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)

já podemos completar a tarefa necessária.

Como está, a lógica é bem simples, não é?

Aqui está uma classe implementada por mim para imprimir a barra de progresso:

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)

O efeito é o seguinte:

Desta forma, você pode verificar convenientemente o progresso da execução de algumas tarefas, como escaneamento, aprendizado de máquina e outros trabalhos que não sabem quanto tempo levarão, também terão uma percepção visual do tempo.

Este é o conteúdo completo do código de implementação da função de barra de progresso no console Python que o editor compartilha com vocês. Espero que isso forneça uma referência útil e que vocês apoiem e clamem pelo tutorial.

Declaração: O conteúdo deste artigo é extraído da internet, pertence ao respectivo detentor dos direitos autorais, foi contribuído e carregado voluntariamente pelos usuários da internet, este site não possui os direitos de propriedade, não foi editado manualmente e não assume responsabilidade por eventuais responsabilidades legais. Se você encontrar conteúdo suspeito de violação de direitos autorais, bem-vindo a enviar e-mail para: notice#oldtoolbag.com (ao enviar e-mail, troque # por @ para denunciar e forneça provas relevantes. Aos verificarmos, o site deletará imediatamente o conteúdo suspeito de violação de direitos autorais.)

Você também pode gostar