Domanda

Sono nuovo di pitone e sto scrivendo alcuni script per automatizzare il download di file da server FTP, ecc Voglio mostrare lo stato di avanzamento del download, ma voglio che rimanga nella stessa posizione, come ad esempio:

uscita:

  

Download File FooFile.txt [47%]

Sto cercando di evitare qualcosa di simile:

     Downloading File FooFile.txt [47%]
     Downloading File FooFile.txt [48%]
     Downloading File FooFile.txt [49%]

Come devo andare a fare questo?


Duplica : Come posso stampare sopra la riga corrente in un'applicazione a riga di comando?

È stato utile?

Soluzione

È inoltre possibile utilizzare il ritorno a capo:

sys.stdout.write("Download progress: %d%%   \r" % (progress) )
sys.stdout.flush()

Altri suggerimenti

Utilizzare una libreria di terminale di gestione come il maledice modulo :

  

Il modulo curses fornisce un'interfaccia alla libreria curses, lo standard di fatto per la gestione terminale portatile advanced.

Python 2

Mi piace il seguente:

print 'Downloading File FooFile.txt [%d%%]\r'%i,

Demo:

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="")

Demo:

import time

for i in range(100):
    time.sleep(0.1)
    print('Downloading File FooFile.txt [%d%%]\r'%i, end="")

Stampa il carattere backspace \b diverse volte, e quindi sovrascrivere il vecchio numero con il nuovo numero.

#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="")

Per Python 3xx:

import time
for i in range(10):
    time.sleep(0.2) 
    print ("\r Loading... {}".format(i)+str(i), end="")

Una soluzione pulita che ha lavorato per me è:

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("")

Il sys.stdout.flush è importante altrimenti si fa veramente goffo e il print("") avanti per l'uscita ad anello è anche importante.

Aggiorna : Come accennato nei commenti, print ha anche un argomento flush. Così il seguente funziona anche:

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="")
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top