Para implementar uma barra de status como abaixo:
[========== ] 45%
[================ ] 60%
[==========================] 100%
Quero que isso seja impresso no stdout e continue atualizando-o, não imprima para outra linha. Como fazer isso?
Respostas:
Há um módulo Python que você pode obter do PyPI chamado
progressbar
que implementa essa funcionalidade. Se você não se importa em adicionar uma dependência, é uma boa solução. Caso contrário, vá com uma das outras respostas.Um exemplo simples de como usá-lo:
Para instalá-lo, você pode usar
easy_install progressbar
, oupip install progressbar
se preferir pip.fonte
bar.start()
?bar.start()
sudo -H pip install progressbar2
.O
'\r'
caractere (retorno de carro) redefine o cursor para o início da linha e permite que você escreva sobre o que estava anteriormente na linha.Não tenho 100% de certeza se isso é completamente portátil em todos os sistemas, mas funciona no Linux e OSX, pelo menos.
fonte
n=21
, substituarange(21)
comrange(n)
, em seguida, adicionej = (i + 1) / n
dentro do loop, e substituir awrite
indicação com esta ligeira modificação:sys.stdout.write("[%-20s] %d%%" % ('='*int(20*j), 100*j))
. Agora, a única alteração que você precisa fazer én=21
antes do loop (mais prováveln=len(iterable)
) e depois enumerar sobre o objeto iterável. Eu recomendei esta edição, mas ela foi rejeitada; aparentemente a funcionalidade "se desvia da intenção original do post".sys.stdout.write("[{:{}}] {:.1f}%".format("="*i, n-1, (100/(n-1)*i)))
,, somente Python 3 #Encontrei a biblioteca útil tqdm ( https://github.com/tqdm/tqdm/ , anteriormente: https://github.com/noamraph/tqdm ). Ele estima automaticamente o tempo de conclusão e pode ser usado como iterador.
Uso:
Resulta em:
tqdm
pode envolver qualquer iterável.fonte
Você pode usar
\r
( retorno de carro ). Demo:fonte
total
como10
, então você recebe a mensagem de erroZeroDivisionError: long division or modulo by zero
Aqui você pode usar o seguinte código como uma função:
Com o uso de .format:
fonte
] percent * 100 %
com base nas respostas acima e em outras perguntas semelhantes sobre a barra de progresso da CLI, acho que recebi uma resposta geral geral para todas elas. Verifique em https://stackoverflow.com/a/15860757/2254146
Aqui está uma cópia da função, mas modificada para se adequar ao seu estilo:
Parece
Porcentagem: [====================] 99,0%
fonte
Se você estiver desenvolvendo uma interface de linha de comando, sugiro que você dê uma olhada no
click
que é muito bom:Aqui a saída que você obtém:
fonte
Melhorando ainda mais, usando uma função como:
exemplo de chamada:
resultado:
fonte
Encontrei este tópico hoje e depois de experimentar essa solução da Mark Rushakoff
Posso dizer que isso funciona bem no W7-64 com o python 3.4.3 de 64 bits, mas apenas no console nativo. No entanto, ao usar o console interno do spyder 3.0.0dev, as quebras de linha ainda estão presentes novamente. Como isso levou algum tempo para descobrir, gostaria de relatar esta observação aqui.
fonte
Com base em algumas das respostas aqui e em outros lugares, escrevi essa função simples que exibe uma barra de progresso e o tempo restante decorrido / estimado. Deve funcionar na maioria das máquinas baseadas em unix.
fonte
Essa é uma abordagem bastante simples que pode ser usada com qualquer loop.
fonte
Mais fácil ainda
A chave é converter o tipo inteiro em string.
fonte
Conforme descrito na solução de Mark Rushakoff , você pode gerar o caractere de retorno de carro
sys.stdout.write('\r')
, para redefinir o cursor para o início da linha. Para generalizar essa solução, além de implementar as f-Strings do Python 3 , você pode usarfonte
Experimente o PyProg. PyProg é uma biblioteca de código aberto para Python para criar barras e indicadores de progresso super personalizáveis.
Atualmente, está na versão 1.0.2; está hospedado no Github e disponível no PyPI (links abaixo). É compatível com Python 3 e 2 e também pode ser usado com o Qt Console.
É realmente fácil de usar. O código a seguir:
produzirá exatamente o que você deseja (até o comprimento da barra!):
Para mais opções para personalizar a barra de progresso, vá para a página Github deste site.
Na verdade, eu criei o PyProg porque precisava de uma biblioteca de barras de progresso simples, mas super personalizável. Você pode facilmente instalá-lo com:
pip install pyprog
.PyProg Github: https://github.com/Bill13579/pyprog
PyPI: https://pypi.python.org/pypi/pyprog/
fonte
Usando a resposta do @ Mark-Rushakoff, desenvolvi uma abordagem mais simples, sem necessidade de chamar a biblioteca sys. Funciona com o Python 3. Testado no Windows:
fonte
print
é um invólucro fino que formata a entrada e chama a função de gravação de um determinado objeto. Por padrão, esse objeto ésys.stdout
.Aqui está algo que eu fiz usando a solução de @ Mark-Rushakoff. Ajustar adaptativamente à largura do terminal.
fonte