Konsolda aynı yere nasıl çıktı yazarım?


158

Python için yeniyim ve FTP sunucularından dosyaları indirmeyi otomatikleştirmek için bazı komut dosyaları yazıyorum. İndirme işleminin ilerlemesini göstermek istiyorum, ancak aynı konumda kalmasını istiyorum, örneğin:

çıktı:

FooFile.txt Dosyasını İndirme [47%]

Böyle bir şeyden kaçınmaya çalışıyorum:

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

Bunu nasıl yapmalıyım?


Çoğalt : Komut satırı uygulamasındaki geçerli satırın üzerine nasıl yazdırabilirim?


1
bu kullanımı kolay modülle ilgileniyor olabilirsiniz, bu bir metin ilerleme çubuğu. pypi.python.org/pypi/progressbar/2.2
wim

Yanıtlar:


254

Ayrıca, satır başını da kullanabilirsiniz:

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

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

5
Ayrıca sys.stdout.flush () için bir çağrı eklemek zorunda kaldım, böylece imleç etrafında
zıplamadı

19
Bunu birden fazla satırla yapmak mümkün mü? Üç farklı indirmem olduğunu ve her birinin ilerlemesini kendi satırında göstermek istediğimizi varsayalım.
EarlCrapstone

11
\rSatır başına koymak \x1b[Kve önceki metni temizlemek için bir eklemek istiyorum .
augurar

11
Bu, aşağıdaki python 3 için en basit çözüm gibi görünüyor (aşağıdaki cevaplarda belirtildiği gibi): print("sample text", end='\r", flush=True)
Cyrus

35

Python 2

Aşağıdaki gibi:

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

Python 3 ile PyCharm Hata Ayıklayıcı Konsolu

# On PyCharm Debugger console, \r needs to come before the text.
# Otherwise, the text may not appear at all, or appear inconsistently.
# tested on PyCharm 2019.3, Python 3.6

import time

print('Start.')
for i in range(100):
    time.sleep(0.02)
    print('\rDownloading File FooFile.txt [%d%%]'%i, end="")
print('\nDone.')

9
bunu python 3+ için kullanın: print ('Dosya İndiriliyor FooFile.txt [% d %%] \ r'% i, end = "")
hkoosha

PyCharm Hata Ayıklayıcı konsolunda, metinden önce gelmesi gerekir. Aksi takdirde, metin hiç görünmeyebilir veya tutarsız görünebilir. Düzenleme olarak benim için çalışan sürümü ekledim, çünkü bu cevaba çok satırlı kod yazamadım. Düzenleme onay beklerken insanların görüntüleyebilmesi için gistime koydum
Yul Kang,

Dizenin sonundaki "r" benim için PyCharm 2020.1 (PyCharm 2020.1.2 (Topluluk Sürümü); 31 Mayıs 2020'de oluşturulmuş # PC-201.7846.77) hata ayıklayıcı konsolunda çalışır.
battey


15

Geri silme karakterini \bbirkaç kez yazdırın ve ardından eski sayıyı yeni sayının üzerine yazın.


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

Bunu beğendim çünkü önceki komutları temizlemiyor (ekranda bırakmak istediğiniz birden fazla aşama varsa)
Nathan Donnellan

3
Satır başı (örn. print 'Downloading.... \r') Kullanmak da önceki verileri temizlemez, ancak ne kadar yedekleneceğini bilmek zorunda kalmaz.
cod3monk3y

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

Bu neden yukarıdakilerden daha iyi (Ben bir Python n00b, lütfen cehaletimi affedin :-))?
BalinKingOfMoria Eski CM'ler

7

Python 3xx için:

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

4

Benim için çalışan düzgün bir çözüm:

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.flushAksi takdirde gerçekten aksak alır ve önemli print("")döngü çıkış için ayrıca önemlidir.

GÜNCELLEME : Yorumlarda belirtildiği gibi, bir printde flushargümanı vardır. Yani aşağıdakiler de işe yarayacak:

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 olarak, bir arg sağlayabilmektedir flush=Trueiçin print, bu yüzden ekstra için gerek yoktur sys.stdout.flush()çağrı.
PM 2Ring

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="")
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.