Como faço para escrever a saída no mesmo lugar no console?
-
21-08-2019 - |
Pergunta
Eu sou novo para python e estou escrevendo alguns scripts para automatizar o download de arquivos de servidores FTP, etc. Quero mostrar o progresso do download, mas eu quero que ele fique na mesma posição, tais como:
saída:
FooFile.txt download de arquivos [47%]
Eu estou tentando evitar algo como isto:
Downloading File FooFile.txt [47%]
Downloading File FooFile.txt [48%]
Downloading File FooFile.txt [49%]
Como devo ir sobre como fazer isso?
Duplicar : Como posso imprimir sobre a linha atual em um aplicativo de linha de comando?
Solução
Você também pode usar o retorno de carro:
sys.stdout.write("Download progress: %d%% \r" % (progress) )
sys.stdout.flush()
Outras dicas
Use uma biblioteca de terminais de manipulação como o maldições módulo :
O módulo maldições fornece uma interface para a biblioteca maldições, o padrão de fato para manipulação do terminal avançado portátil.
Python 2
I como o seguinte:
print 'Downloading File FooFile.txt [%d%%]\r'%i,
Demonstração:
import time
for i in range(100):
time.sleep(0.1)
print 'Downloading File FooFile.txt [%d%%]\r'%i,
Python 3
print('Downloading File FooFile.txt [%d%%]\r'%i, end="")
Demonstração:
import time
for i in range(100):
time.sleep(0.1)
print('Downloading File FooFile.txt [%d%%]\r'%i, end="")
Imprimir o caráter de retrocesso \b
várias vezes, e, em seguida, substituir o número antigo com o novo número.
#kinda like the one above but better :P
from __future__ import print_function
from time import sleep
for i in range(101):
str1="Downloading File FooFile.txt [{}%]".format(i)
back="\b"*len(str1)
print(str1, end="")
sleep(0.1)
print(back, end="")
Para Python 3xx:
import time
for i in range(10):
time.sleep(0.2)
print ("\r Loading... {}".format(i)+str(i), end="")
Uma solução elegante que tem trabalhado para mim é:
from __future__ import print_function
import sys
for i in range(10**6):
perc = float(i) / 10**6 * 100
print(">>> Download is {}% complete ".format(perc), end='\r')
sys.stdout.flush()
print("")
O sys.stdout.flush
é importante, caso contrário ele fica muito desajeitado e o print("")
por saída de loop também é importante.
Atualizar : Como mencionado nos comentários, print
também tem um argumento flush
. Então, o seguinte será também trabalho:
from __future__ import print_function
for i in range(10**6):
perc = float(i) / 10**6 * 100
print(">>> Download is {}% complete ".format(perc), end='\r', flush=True)
print("")
x="A Sting {}"
for i in range(0,1000000):
y=list(x.format(i))
print(x.format(i),end="")
for j in range(0,len(y)):
print("\b",end="")