Eu escrevi um aplicativo de console simples para carregar e baixar arquivos de um servidor FTP usando o ftplib.
Gostaria que o aplicativo mostrasse alguma visualização do progresso do download / upload para o usuário; sempre que um bloco de dados é baixado, eu gostaria de fornecer uma atualização de progresso, mesmo que seja apenas uma representação numérica como uma porcentagem.
Importante, quero evitar apagar todo o texto que foi impresso no console nas linhas anteriores (ou seja, não quero "limpar" todo o terminal enquanto estiver imprimindo o progresso atualizado).
Essa parece uma tarefa bastante comum - como posso fazer uma barra de progresso ou uma visualização semelhante que seja exibida no meu console, preservando a saída anterior do programa?
Respostas:
Uma barra de progresso simples e personalizável
Aqui está um agregado de muitas das respostas abaixo que eu uso regularmente (não são necessárias importações).
Nota: Isto é para Python 3; veja os comentários para obter detalhes sobre como usá-lo no Python 2.
Uso da amostra
Saída de amostra:
Atualizar
Houve discussão nos comentários sobre uma opção que permite que a barra de progresso se ajuste dinamicamente à largura da janela do terminal. Embora eu não recomendo isso, aqui está uma essência que implementa esse recurso (e observa as advertências).
fonte
# Size of terminal rows, columns = [int(x) for x in os.popen('stty size', 'r').read().split()]
columns
deve ser passada ao comprimento para ajustar o tamanho da barra de progresso à janela do terminal. Embora o comprimento de progredindo parte de barra deve ser diminuída (por comprimento de prefixo, sufixo, por cento e caracteres adicionais nesta cadeia'\r%s |%s| %s%% %s'
end = '\r'
paraend = ''
.Escrever '\ r' moverá o cursor de volta ao início da linha.
Isso exibe um contador de porcentagem:
fonte
99%
print
tem umend
argumento: stackoverflow.com/a/8436827/1959808print
também tem umflush
argumento: docs.python.org/3/library/functions.html#printtqdm: adicione um medidor de progresso aos seus loops em um segundo :
fonte
Escreva um
\r
no console. Isso é um "retorno de carro" que faz com que todo o texto depois seja ecoado no início da linha. Algo como:o que lhe dará algo como:
[ ########## ] 100%
fonte
\r
e escreva a linha inteira novamente. Basicamente:print("\rProgress: [{0:50s}] {1:.1f}%".format('#' * int(amtDone * 50), amtDone * 100))
, ondeamtDone
é uma flutuação entre 0 e 1.sys.stdout.write
queprint
. Comprint
eu tenho novas linhas.,
no final dosprint
trabalhos para mim.print("\rProgress: [{0:50s}] {1:.1f}%".format('#' * int(workdone * 50), workdone*100), end="", flush=True)
, ondeworkdone
é um flutuador entre 0 e 1, por exemplo,workdone = parsed_dirs/total_dirs
É menos de 10 linhas de código.
A essência aqui: https://gist.github.com/vladignatyev/06860ec2040cb497f0f3
fonte
Experimente a biblioteca de cliques criada pelo Mozart of Python, Armin Ronacher.
Para criar uma barra de progresso simples:
Isto é o que parece:
Personalize para o seu coração o conteúdo:
Aparência personalizada:
Existem ainda mais opções, consulte os documentos da API :
fonte
Percebo que estou atrasado para o jogo, mas aqui está um que eu escrevi (Red Hat), um pouco Yum (não indo para 100% de precisão aqui, mas se você estiver usando uma barra de progresso para esse nível de precisão, então você de qualquer maneira):
Deve produzir algo parecido com isto:
... onde os colchetes permanecem estacionários e apenas os hashes aumentam.
Isso pode funcionar melhor como decorador. Por mais um dia ...
fonte
Confira esta biblioteca: clint
possui muitos recursos, incluindo uma barra de progresso:
este link fornece uma visão geral rápida de seus recursos
fonte
Aqui está um bom exemplo de uma barra de progresso escrita em Python: http://nadiana.com/animated-terminal-progress-bar-in-pythonMas se você quiser escrever você mesmo. Você pode usar o
curses
módulo para facilitar as coisas :)[editar] Talvez mais fácil não seja a palavra para maldições. Mas se você deseja criar um cui completo, as maldições cuidam de muitas coisas para você.
[edit] Como o link antigo está inoperante, criei minha própria versão de uma barra de progresso Python, obtenha-a aqui: https://github.com/WoLpH/python-progressbar
fonte
curses
? Mais fácil? Hmmm ....resultado
[29%] ===================
fonte
e, apenas para adicionar à pilha, aqui está um objeto que você pode usar
resulta em:
Geralmente, isso é considerado "exagerado", mas é útil quando você o usa muito
fonte
Instale
tqdm
. (pip install tqdm
) E use-o da seguinte maneira:Essa é uma barra de progresso de 10 segundos que produzirá algo como isto:
fonte
Execute isso na linha de comando Python ( não em qualquer ambiente de desenvolvimento ou IDE):
Funciona bem no meu sistema Windows.
fonte
E muitos tutoriais esperando para serem pesquisados no Google.
fonte
Estou usando o progresso do reddit . Gosto porque ele pode imprimir o progresso de cada item em uma linha e não deve apagar as impressões do programa.
Editar: link fixo
fonte
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
Em resumo, o código é este:
Parece
Porcentagem: [##########] 99,0%
fonte
Eu recomendo usar o tqdm - https://pypi.python.org/pypi/tqdm - que simplifica transformar qualquer iterável ou processo em uma barra de progresso e lida com toda a bagunça nos terminais necessários.
Na documentação: "O tqdm pode facilmente suportar retornos de chamada / ganchos e atualizações manuais. Veja um exemplo com o urllib"
fonte
Tente instalar este pacote
pip install progressbar2
::progresssbar github: https://github.com/WoLpH/python-progressbar
fonte
Uma solução muito simples é colocar esse código em seu loop:
Coloque isso no corpo (ou seja, no topo) do seu arquivo:
Coloque isso no corpo do seu loop:
fonte
OBSERVAÇÃO: se você executar isso no interceptador interativo, obterá números extras impressos
fonte
lol eu acabei de escrever uma coisa toda para isso aqui está o código tenha em mente que você não pode usar unicode ao fazer bloco ascii eu uso cp437
e você chama assim
então fica assim
fonte
Com os ótimos conselhos acima, elaboro a barra de progresso.
No entanto, gostaria de salientar algumas deficiências
Toda vez que a barra de progresso é liberada, ela inicia em uma nova linha
assim:
[] 0%
[#] 10%
[##] 20%
[###] 30%
2.O colchete ']' e o número da porcentagem no lado direito mudam para a direita à medida que o '###' fica mais longo.
3. Ocorrerá um erro se a expressão 'progress / 10' não puder retornar um número inteiro.
E o código a seguir irá corrigir o problema acima.
fonte
Código para barra de progresso do terminal python
fonte
eu escrevi uma barra de progresso simples:
como você pode ver, ele possui: comprimento da barra, prefixo e sufixo, preenchimento, espaço, texto na barra em 100% (oncomp) e bordas
aqui um exemplo:
em andamento:
em completo:
fonte
Reunindo algumas das idéias que encontrei aqui e adicionando tempo estimado restante:
fonte
Para python 3:
fonte
Bem, aqui está o código que funciona e eu testei antes de postar:
Prós:
Contras:
prog2 = prog/5
paraprog2 = int(prog/5)
)fonte
Aqui está a minha solução Python 3:
'\ b' é uma barra invertida, para cada caractere em sua string. Isso não funciona na janela do cmd do Windows.
fonte
função do Greenstick para 2.7:
fonte
A barra de progresso do módulo python é uma ótima opção. Aqui está o meu código típico:
fonte