2009-02-05 24 views
111

python için yeni ve İndirme ilerlemesini göstermek istiyorum FTP sunucuları, vb dosya indirirken otomatikleştirmek için bazı komut dosyaları yazıyorum ama gibi, aynı pozisyonda kalmak istiyorum:Çıkışı konsolda aynı yere nasıl yazarım?

çıkışı:

İndirilmesi Dosya FooFile.txt [% 47] böyle bir şey önlemek için çalışıyorum

:

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

Bunu yapmak için nasıl gitmeliyim?


Yinelenen: How can I print over the current line in a command line application?

+1

Bu kolay kullanımlı modülünde isteyebilecek, bir metin ilerleme çubuğu bulunuyor. http://pypi.python.org/pypi/progressbar/2.2 – wim

cevap

188

Ayrıca satırbaşını kullanabilirsiniz:

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

Çok yaygın ve basit bir çözüm. Not: Hattın terminalinizin genişliğinden daha uzunsa, bu çirkinleşir. – ephemient

+4

Ayrıca, sys.stdout.flush() öğesine bir çağrı eklemek zorunda kaldım, böylece imleç – scottm

+2

etrafında sıçramadı UNIX – g33kz0r

13

Baskı geri tuşu karakteri \b birkaç kez ve sonra yeni numara ile eski numarayı üzerine.

+0

ilginç, bu şekilde yapmayı düşünmemiştim. –

+0

Bunu beğendim çünkü önceki komutları temizlemiyor (ekranda birden çok aşamaya sahip olmak istediğinizde) –

+2

Satır geri dönüşünü kullanma (örn. 'Yazdırılıyor .... .... \ r'') Önceki veriler, ancak geri yedeklemek için ne kadar uzak olduğunu bilmek zorunda kalmasını engeller. – cod3monk3y

21

kullanımlar curses module gibi bir terminal işleme kitaplığı:

küfür modülü küfür kütüphane, taşınabilir ileri uç kullanım için fiili standart bir ara yüz sağlar.

+1

+1 yeni bir modül tanıtmak için – pylover

+1

Windows için mevcut değildir. –

+3

@Diego, artık Windows'ta curses modülü için bir destek kütüphanesi var. bkz. http://stackoverflow.com/a/19851287/1426237 – Plexico

9

aşağıdaki gibi:

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

Demo: has

import time 

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

bunu python 3+ için kullanın: print (' Dosya Yükleme FooFile.txt [% d %%] \ r '% i , end = "") – loolooyyyy

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

Bu neden yukarıdakilerden daha iyi (Ben bir Python n00b'yim, bu yüzden lütfen cehaletimi affedin :-))? – BalinKingOfMoria

3

düzenli bir çözüm çalışıyor Benim için gr geçerli:

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

sys.stdout.flush

aksi takdirde gerçekten aksak alır ve döngü çıkış için üzerinde print("") da önemlidir önemlidir.

GÜNCELLEME: Açıklamalarda belirtildiği gibi, print ayrıca flush argüman vardır. Yani şu da çalışacaktır:

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

Modern Python'da, "flush = True" değerine bir arg sunabilirsin print ', bu yüzden ekstra' sys.stdout.flush() 'çağrısı gerek yok. –

2

Python 3xx için:

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

print (" \ r Yükleniyor ... {} ". format (i), end =" ") – omasoud

0
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="") 
İlgili konular