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