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?

Foi útil?

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="")
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top