Konsoldaki Metin İlerleme Çubuğu [kapalı]


435

Ftplib kullanarak bir FTP sunucusundan dosya yüklemek ve indirmek için basit bir konsol uygulaması yazdım.

Uygulamanın kullanıcı için indirme / yükleme ilerlemesinin bazı görselleştirmelerini göstermesini istiyorum; bir veri yığını her indirildiğinde, bir yüzde gibi sayısal bir gösterim olsa bile, bir ilerleme güncellemesi sağlamasını isterim.

Daha da önemlisi, önceki satırlarda konsola yazdırılan tüm metni silmekten kaçınmak istiyorum (yani, güncellenen ilerlemeyi yazdırırken tüm terminali "temizlemek" istemiyorum).

Bu oldukça yaygın bir görev gibi görünüyor - önceki program çıktısını korurken konsoluma çıkan bir ilerleme çubuğu veya benzer bir görselleştirme yapmaya nasıl devam edebilirim?


Hmm, dün sorulan bu sorunun bir kopyası gibi görün: stackoverflow.com/questions/3160699/python-progress-bar/3162864 Bu yüzden, balık pypi.python.org/pypi/fish
Etienne

29
"sadece bir GUI kullanın", GUI'lerin bazı durumlarda (hızlı öğrenme eğrisi, geçici keşif veya etkileşimli veya bir kerelik etkinlikler) harika olduğunu, komut satırı araçlarının diğerleri için (uzman kullanıcılar, özel uygulamalar oluşturan dikkatli bir şekilde tanımlanmış bir operasyon gerçekleştirmek için anında.)
Jonathan Hartley

14
Yeniden açmaya oy verdim. Soru bana çok geniş vurmuyor.
Franck Dernoncourt

Aradığın şeyin tqdm olduğunu düşünüyorum ... ama neden SO neden beni eski sorular hakkında tekrar oyları gözden geçirmek için yönlendiriyor bilmiyorum.
kungphu

Çok güzel animasyonların yanı sıra yazdırabileceğiniz, iş hacmini ve etayı görebileceğiniz, hatta duraklatabileceğiniz yeni bir tür ilerleme çubuğu yayınladım! Lütfen bir göz atın: github.com/rsalmei/alive-progress ! canlı ilerleme
rsalmei

Yanıtlar:


465

Basit, Özelleştirilebilir İlerleme Çubuğu

Aşağıda, düzenli olarak kullandığım cevapların çoğunun bir toplamı (ithalat gerekmez).

# Print iterations progress
def printProgressBar (iteration, total, prefix = '', suffix = '', decimals = 1, length = 100, fill = '█', printEnd = "\r"):
    """
    Call in a loop to create terminal progress bar
    @params:
        iteration   - Required  : current iteration (Int)
        total       - Required  : total iterations (Int)
        prefix      - Optional  : prefix string (Str)
        suffix      - Optional  : suffix string (Str)
        decimals    - Optional  : positive number of decimals in percent complete (Int)
        length      - Optional  : character length of bar (Int)
        fill        - Optional  : bar fill character (Str)
        printEnd    - Optional  : end character (e.g. "\r", "\r\n") (Str)
    """
    percent = ("{0:." + str(decimals) + "f}").format(100 * (iteration / float(total)))
    filledLength = int(length * iteration // total)
    bar = fill * filledLength + '-' * (length - filledLength)
    print('\r%s |%s| %s%% %s' % (prefix, bar, percent, suffix), end = printEnd)
    # Print New Line on Complete
    if iteration == total: 
        print()

Not: Bu Python 3 içindir; bunu Python 2'de kullanma hakkındaki ayrıntılar için yorumlara bakın.

Örnek Kullanımı

import time

# A List of Items
items = list(range(0, 57))
l = len(items)

# Initial call to print 0% progress
printProgressBar(0, l, prefix = 'Progress:', suffix = 'Complete', length = 50)
for i, item in enumerate(items):
    # Do stuff...
    time.sleep(0.1)
    # Update Progress Bar
    printProgressBar(i + 1, l, prefix = 'Progress:', suffix = 'Complete', length = 50)

Örnek Çıktı:

Progress: |█████████████████████████████████████████████-----| 90.0% Complete

Güncelleme

Yorumlar bölümünde ilerleme çubuğunun terminal penceresi genişliğine dinamik olarak ayarlanmasına izin veren bir seçenekle ilgili tartışma vardı. Bunu tavsiye etmese de, bu özelliği uygulayan bir özgeçmiş (ve uyarıları not ediyor).


21
Bu pasaj harika çalışıyor! Birkaç küçük sorunla karşılaştım, bu yüzden bazı küçük düzenlemeler yaptım (PEP-8, ascii olmayan karakter için varsayılan kodlama) ve bunları bir özete
Aubricus

3
Python 2 @Aubricus
Greenstick'i

2
@MattClimbs Bu, varsayılan olarak UTF-8 kodlaması kullanan Python 3 için yazılmıştır. UTF-8 karakteri olan işlevin varsayılan dolgu parametresini değiştirebilir veya UTF-8 bildirimini kullanabilirsiniz. UTF-8 bildiriminin nasıl görünmesi gerektiğine ilişkin bir örnek için yukarıdaki açıklamadaki özete bakın.
Greenstick

1
Teşekkürler, güzel özet, ayrıca terminal boyutunun tespiti, # Size of terminal rows, columns = [int(x) for x in os.popen('stty size', 'r').read().split()] columnsilerleme çubuğu boyutunu terminal penceresine ayarlamak için bu fonksiyonun uzunluğa geçirilmesi için yararlı olabilir . Çubuğun ilerleyen bölümünün uzunluğu '\r%s |%s| %s%% %s'
azaltılsa da

3
Bazı IDE çalışmaları (örn pycharm Windows üzerinde) bu almak için değişim gerekebilir end = '\r'için end = ''.
thomas88wp

312

'\ R' yazmak imleci satırın başına götürecektir.

Bu bir yüzde sayacı görüntüler:

import time
import sys

for i in range(100):
    time.sleep(1)
    sys.stdout.write("\r%d%%" % i)
    sys.stdout.flush()

3
Yapıştırdı ve koştu. Her seferinde yeni bir satıra yazdırır. Numaranın aynı satırda güncellenmesini istiyorum. :)
bobber205

8
Bu örnek ayrıca yüklemesi sona eren bir OBOB üretir99%
Glenn Dayton

10
@moose "Bir hata tarafından kapalı" anlamına gelir
Glenn Dayton

3
printBir sahiptir end: argüman stackoverflow.com/a/8436827/1959808
Ioannis Filippidis

3
@IoannisFilippidis'in söylediklerine eklemek için printbir flushargümanı da vardır : docs.python.org/3/library/functions.html#print
Wso


113

\rKonsola bir yazın . Bu, satır başlangıcında tüm metnin yankılanmasına neden olan bir "satır başı" dır . Gibi bir şey:

def update_progress(progress):
    print '\r[{0}] {1}%'.format('#'*(progress/10), progress)

hangi gibi bir şey verecektir: [ ########## ] 100%


19
Yapın \rve sonra tüm satırı tekrar yazın. Temel olarak:, 0 ile 1 arasında bir şamandıra print("\rProgress: [{0:50s}] {1:.1f}%".format('#' * int(amtDone * 50), amtDone * 100))neredeamtDone
Mike DeSimone

13
Kullanmak sys.stdout.writedaha iyidir print. İle printyeni satırları var.
Gill Bates

14
işlerin ,sonuna virgül koy print.
Chunliang Lyu

10
python3 kullanım baskı (...., uç = '') ve herhangi bir yeni satır olmaz
graywolf

7
Python3 eski contribs için özetleme: 0 ile 1 arasında bir şamandıra print("\rProgress: [{0:50s}] {1:.1f}%".format('#' * int(workdone * 50), workdone*100), end="", flush=True)nerede workdone, örneğin,workdone = parsed_dirs/total_dirs
khyox

70

10 satırdan az kod.

Buradaki öz: https://gist.github.com/vladignatyev/06860ec2040cb497f0f3

import sys


def progress(count, total, suffix=''):
    bar_len = 60
    filled_len = int(round(bar_len * count / float(total)))

    percents = round(100.0 * count / float(total), 1)
    bar = '=' * filled_len + '-' * (bar_len - filled_len)

    sys.stdout.write('[%s] %s%s ...%s\r' % (bar, percents, '%', suffix))
    sys.stdout.flush()  # As suggested by Rom Ruben

resim açıklamasını buraya girin


2
işlevin sonuna "sys.stdout.flush ()" ekler.
romruben

benim için yeni bir sıraya giriyor
GM

@ GM hangi işletim sistemi / platformu kullanıyorsunuz?
Vladimir Ignatyev

Neden spyder ide çalıştırırsam işe yaramıyor ama ipython konsolundan çalıştırırsam işe yarıyor!
GM

62

Python Mozart Armin Ronacher tarafından yazılan tıklama kütüphanesini deneyin .

$ pip install click # both 2 and 3 compatible

Basit bir ilerleme çubuğu oluşturmak için:

import click

with click.progressbar(range(1000000)) as bar:
    for i in bar:
        pass 

Öyle görünüyor:

# [###-------------------------------]    9%  00:01:14

Kalplerinizin içeriğini özelleştirin:

import click, sys

with click.progressbar(range(100000), file=sys.stderr, show_pos=True, width=70, bar_template='(_(_)=%(bar)sD(_(_| %(info)s', fill_char='=', empty_char=' ') as bar:
    for i in bar:
        pass

Özel görünüm:

(_(_)===================================D(_(_| 100000/100000 00:00:02

Daha da fazla seçenek var, API belgelerine bakın :

 click.progressbar(iterable=None, length=None, label=None, show_eta=True, show_percent=None, show_pos=False, item_show_func=None, fill_char='#', empty_char='-', bar_template='%(label)s [%(bar)s] %(info)s', info_sep=' ', width=36, file=None, color=None)

33

Oyuna geç kaldığımı fark ettim, ama burada yazdığım biraz Yum tarzı (Kırmızı Şapka) (burada% 100 doğruluk için gitmiyorum, ancak bu doğruluk seviyesi için bir ilerleme çubuğu kullanıyorsanız, o zaman zaten YANLIŞSIN):

import sys

def cli_progress_test(end_val, bar_length=20):
    for i in xrange(0, end_val):
        percent = float(i) / end_val
        hashes = '#' * int(round(percent * bar_length))
        spaces = ' ' * (bar_length - len(hashes))
        sys.stdout.write("\rPercent: [{0}] {1}%".format(hashes + spaces, int(round(percent * 100))))
        sys.stdout.flush()

Şuna benzer bir şey üretmelidir:

Percent: [##############      ] 69%

... köşeli parantezler sabit durur ve sadece karmalar artar.

Bu bir dekoratör olarak daha iyi çalışabilir. Başka bir gün için...


2
Harika bir çözüm! Mükemmel çalışıyor! Çok teşekkür ederim!
Vasilije Bursac

18

Bu kütüphaneyi kontrol et: clint

ilerleme çubuğu da dahil olmak üzere birçok özelliğe sahiptir:

from time import sleep  
from random import random  
from clint.textui import progress  
if __name__ == '__main__':
    for i in progress.bar(range(100)):
        sleep(random() * 0.2)

    for i in progress.dots(range(100)):
        sleep(random() * 0.2)

bu bağlantı özelliklerine hızlı bir genel bakış sağlar


12

Python'da yazılmış bir ilerleme çubuğuna güzel bir örnek: http://nadiana.com/animated-terminal-progress-bar-in-python

Ama kendiniz yazmak istiyorsanız. cursesİşleri kolaylaştırmak için modülü kullanabilirsiniz :)

Muhtemelen daha kolay lanetlerin sözcüğü değildir. Ama lanetlerden daha iyi bir cui oluşturmak istiyorsanız, sizin için birçok şeyle ilgilenir.

Eski bağlantı öldüğünden, kendi Python Progressbar sürümümü oluşturdum, buradan edinin : https://github.com/WoLpH/python-progressbar


14
curses? Daha kolay? Hmmm ....
aviraldg

Mükemmel bir makale, ona bir bağlantı verecektim ama yer işaretlerimde bulamadım :)
Andy Mikhaylenko

@Aviral Dasgupta: yeterince doğru, daha kolay burada doğru kelime olmayabilir. Yine de size çok fazla iş kazandırabilir, ancak gerçekten ne aradığınıza bağlıdır.
Wolph

Buna yakın bir şey aramamak, ama yine de teşekkürler. :)
bobber205

2
Ölü bağlantı, bu bağlantıdaki içeriği cevabınıza göndermemenin bedeli -__-
ThorSummoner

11
import time,sys

for i in range(100+1):
    time.sleep(0.1)
    sys.stdout.write(('='*i)+(''*(100-i))+("\r [ %d"%i+"% ] "))
    sys.stdout.flush()

çıktı

[29%] ===================


7

ve sadece yığına eklemek için kullanabileceğiniz bir nesne var

import sys

class ProgressBar(object):
    DEFAULT_BAR_LENGTH = 65
    DEFAULT_CHAR_ON  = '='
    DEFAULT_CHAR_OFF = ' '

    def __init__(self, end, start=0):
        self.end    = end
        self.start  = start
        self._barLength = self.__class__.DEFAULT_BAR_LENGTH

        self.setLevel(self.start)
        self._plotted = False

    def setLevel(self, level):
        self._level = level
        if level < self.start:  self._level = self.start
        if level > self.end:    self._level = self.end

        self._ratio = float(self._level - self.start) / float(self.end - self.start)
        self._levelChars = int(self._ratio * self._barLength)

    def plotProgress(self):
        sys.stdout.write("\r  %3i%% [%s%s]" %(
            int(self._ratio * 100.0),
            self.__class__.DEFAULT_CHAR_ON  * int(self._levelChars),
            self.__class__.DEFAULT_CHAR_OFF * int(self._barLength - self._levelChars),
        ))
        sys.stdout.flush()
        self._plotted = True

    def setAndPlot(self, level):
        oldChars = self._levelChars
        self.setLevel(level)
        if (not self._plotted) or (oldChars != self._levelChars):
            self.plotProgress()

    def __add__(self, other):
        assert type(other) in [float, int], "can only add a number"
        self.setAndPlot(self._level + other)
        return self
    def __sub__(self, other):
        return self.__add__(-other)
    def __iadd__(self, other):
        return self.__add__(other)
    def __isub__(self, other):
        return self.__add__(-other)

    def __del__(self):
        sys.stdout.write("\n")

if __name__ == "__main__":
    import time
    count = 150
    print "starting things:"

    pb = ProgressBar(count)

    #pb.plotProgress()
    for i in range(0, count):
        pb += 1
        #pb.setAndPlot(i + 1)
        time.sleep(0.01)
    del pb

    print "done"

sonuç:

starting things:
  100% [=================================================================]
done

Bu genellikle "üstte" olarak kabul edilir, ancak çok kullandığınızda kullanışlıdır


Bunun için teşekkürler. Küçük düzeltme, plotProgress yöntemi sys.stdout.flush () satırını kullanmalıdır, aksi takdirde görev tamamlanana kadar (mac terminalinde olduğu gibi) ilerleme çubuğu çizilmeyebilir.
osnoz

Bunu seviyorum!!! Kullanımı oldukça kolay !!! Teşekkür
Microos

7

tqdm. ( pip install tqdm) ' İ kurun ve aşağıdaki gibi kullanın:

import time
from tqdm import tqdm
for i in tqdm(range(1000)):
    time.sleep(0.01)

Bu, böyle bir şey çıktılayacak 10 saniyelik bir ilerleme çubuğu:

47%|██████████████████▊                     | 470/1000 [00:04<00:05, 98.61it/s]

6

Bu çalıştır Python komut satırına ( değil herhangi IDE veya geliştirme ortamında):

>>> import threading
>>> for i in range(50+1):
...   threading._sleep(0.5)
...   print "\r%3d" % i, ('='*i)+('-'*(50-i)),

Windows sistemimde iyi çalışıyor.



4

Ben kullanıyorum reddit gelen ilerleme . Bunu seviyorum çünkü tek satırdaki her öğe için ilerleme yazdırabilir ve çıktıları programdan silmemelidir.

Düzenleme: sabit bağlantı


1
Bağlantınız koptu - kaynak koddaki asıl satır 1124 değil, 1274. Yani, doğru bağlantı bu: github.com/reddit/reddit/blob/master/r2/r2/lib/utils/…
Vladimir Ignatyev

Bu varyant benim zevkime göre en iyi tasarıma sahip: yineleyicileri kullanıyor ve muhtemelen her türlü ölçülebilir çalışma ile çalışıyor, geçen süreyi gösteriyor.
Vladimir Ignatyev


3

Yukarıdaki yanıtlara ve CLI ilerleme çubuğu ile ilgili diğer benzer sorulara dayanarak, hepsine genel bir ortak yanıt aldım. Https://stackoverflow.com/a/15860757/2254146 adresinden kontrol edin

Özetle, kod şudur:

import time, sys

# update_progress() : Displays or updates a console progress bar
## Accepts a float between 0 and 1. Any int will be converted to a float.
## A value under 0 represents a 'halt'.
## A value at 1 or bigger represents 100%
def update_progress(progress):
    barLength = 10 # Modify this to change the length of the progress bar
    status = ""
    if isinstance(progress, int):
        progress = float(progress)
    if not isinstance(progress, float):
        progress = 0
        status = "error: progress var must be float\r\n"
    if progress < 0:
        progress = 0
        status = "Halt...\r\n"
    if progress >= 1:
        progress = 1
        status = "Done...\r\n"
    block = int(round(barLength*progress))
    text = "\rPercent: [{0}] {1}% {2}".format( "#"*block + "-"*(barLength-block), progress*100, status)
    sys.stdout.write(text)
    sys.stdout.flush()

Gibi görünüyor

Yüzde: [##########]% 99.0


3

Tqdm - https://pypi.python.org/pypi/tqdm - kullanmanızı öneririm .

Belgelerden: "tqdm geri çağrıları / kancaları ve manuel güncellemeleri kolayca destekleyebilir. İşte urllib ile bir örnek"

import urllib
from tqdm import tqdm

def my_hook(t):
  """
  Wraps tqdm instance. Don't forget to close() or __exit__()
  the tqdm instance once you're done with it (easiest using `with` syntax).

  Example
  -------

  >>> with tqdm(...) as t:
  ...     reporthook = my_hook(t)
  ...     urllib.urlretrieve(..., reporthook=reporthook)

  """
  last_b = [0]

  def inner(b=1, bsize=1, tsize=None):
    """
    b  : int, optional
        Number of blocks just transferred [default: 1].
    bsize  : int, optional
        Size of each block (in tqdm units) [default: 1].
    tsize  : int, optional
        Total size (in tqdm units). If [default: None] remains unchanged.
    """
    if tsize is not None:
        t.total = tsize
    t.update((b - last_b[0]) * bsize)
    last_b[0] = b
  return inner

eg_link = 'http://www.doc.ic.ac.uk/~cod11/matryoshka.zip'
with tqdm(unit='B', unit_scale=True, miniters=1,
          desc=eg_link.split('/')[-1]) as t:  # all optional kwargs
    urllib.urlretrieve(eg_link, filename='/dev/null',
                       reporthook=my_hook(t), data=None)

3

Çok basit bir çözüm, bu kodu döngünüze yerleştirmektir:

Bunu dosyanızın gövdesine (üst kısmına) koyun:

import sys

Bunu döngünüzün gövdesine koyun:

sys.stdout.write("-") # prints a dash for each iteration of loop
sys.stdout.flush() # ensures bar is displayed incrementally

2
import sys
def progresssbar():
         for i in range(100):
            time.sleep(1)
            sys.stdout.write("%i\r" % i)

progressbar()

NOT: Bunu etkileşimli interepter'da çalıştırırsanız, ekstra numaralar yazdırılır


2

lol ben sadece bu heres için bir şey yazdı kod aklınızda tutmak blok ascii kullanırken cp437 kullanırken unicode kullanamazsınız

import os
import time
def load(left_side, right_side, length, time):
    x = 0
    y = ""
    print "\r"
    while x < length:
        space = length - len(y)
        space = " " * space
        z = left + y + space + right
        print "\r", z,
        y += "█"
        time.sleep(time)
        x += 1
    cls()

ve öyle diyorsun

print "loading something awesome"
load("|", "|", 10, .01)

yani böyle görünüyor

loading something awesome
|█████     |

2

Yukarıdaki harika tavsiyeler ile ilerleme çubuğunu çalışıyorum.

Ancak bazı eksikliklere dikkat çekmek istiyorum

  1. İlerleme çubuğu her temizlendiğinde yeni bir satıra başlar

    print('\r[{0}]{1}%'.format('#' * progress* 10, progress))  

    bunun gibi:
    []% 0
    [#]% 10
    [##]% 20
    [###]% 30

2. '###' uzadıkça köşeli parantez ']' ve sağ taraftaki yüzde sayısı sağa kayar.
3. 'progress / 10' ifadesi bir tamsayı döndüremezse bir hata oluşur.

Ve aşağıdaki kod yukarıdaki sorunu çözecektir.

def update_progress(progress, total):  
    print('\r[{0:10}]{1:>2}%'.format('#' * int(progress * 10 /total), progress), end='')

1

Python terminali ilerleme çubuğu kodu

import sys
import time

max_length = 5
at_length = max_length
empty = "-"
used = "%"

bar = empty * max_length

for i in range(0, max_length):
    at_length -= 1

    #setting empty and full spots
    bar = used * i
    bar = bar+empty * at_length

    #\r is carriage return(sets cursor position in terminal to start of line)
    #\0 character escape

    sys.stdout.write("[{}]\0\r".format(bar))
    sys.stdout.flush()

    #do your stuff here instead of time.sleep
    time.sleep(1)

sys.stdout.write("\n")
sys.stdout.flush()

1

basit bir ilerleme çubuğu yazdım:

def bar(total, current, length=10, prefix="", filler="#", space=" ", oncomp="", border="[]", suffix=""):
    if len(border) != 2:
        print("parameter 'border' must include exactly 2 symbols!")
        return None

    print(prefix + border[0] + (filler * int(current / total * length) +
                                      (space * (length - int(current / total * length)))) + border[1], suffix, "\r", end="")
    if total == current:
        if oncomp:
            print(prefix + border[0] + space * int(((length - len(oncomp)) / 2)) +
                  oncomp + space * int(((length - len(oncomp)) / 2)) + border[1], suffix)
        if not oncomp:
            print(prefix + border[0] + (filler * int(current / total * length) +
                                        (space * (length - int(current / total * length)))) + border[1], suffix)

gördüğünüz gibi, çubuk uzunluğu, önek ve sonek, dolgu, boşluk,% 100 (oncomp) üzerinde bar metni ve kenarlıklar

burada bir örnek:

from time import sleep, time
start_time = time()
for i in range(10):
    pref = str((i+1) * 10) + "% "
    complete_text = "done in %s sec" % str(round(time() - start_time))
    sleep(1)
    bar(10, i + 1, length=20, prefix=pref, oncomp=complete_text)

devam ediyor:

30% [######              ]

tamamlandığında:

100% [   done in 9 sec   ] 

1

Burada bulduğum bazı fikirleri bir araya getirmek ve tahmini kalan süreyi eklemek:

import datetime, sys

start = datetime.datetime.now()

def print_progress_bar (iteration, total):

    process_duration_samples = []
    average_samples = 5

    end = datetime.datetime.now()

    process_duration = end - start

    if len(process_duration_samples) == 0:
        process_duration_samples = [process_duration] * average_samples

    process_duration_samples = process_duration_samples[1:average_samples-1] + [process_duration]
    average_process_duration = sum(process_duration_samples, datetime.timedelta()) / len(process_duration_samples)
    remaining_steps = total - iteration
    remaining_time_estimation = remaining_steps * average_process_duration

    bars_string = int(float(iteration) / float(total) * 20.)
    sys.stdout.write(
        "\r[%-20s] %d%% (%s/%s) Estimated time left: %s" % (
            '='*bars_string, float(iteration) / float(total) * 100,
            iteration,
            total,
            remaining_time_estimation
        ) 
    )
    sys.stdout.flush()
    if iteration + 1 == total:
        print 


# Sample usage

for i in range(0,300):
    print_progress_bar(i, 300)

1

Python 3 için:

def progress_bar(current_value, total):
    increments = 50
    percentual = ((current_value/ total) * 100)
    i = int(percentual // (100 / increments ))
    text = "\r[{0: <{1}}] {2}%".format('=' * i, increments, percentual)
    print(text, end="\n" if percentual == 100 else "")

0

Peki burada çalışan kod ve göndermeden önce test:

import sys
def prg(prog, fillchar, emptchar):
    fillt = 0
    emptt = 20
    if prog < 100 and prog > 0:
        prog2 = prog/5
        fillt = fillt + prog2
        emptt = emptt - prog2
        sys.stdout.write("\r[" + str(fillchar)*fillt + str(emptchar)*emptt + "]" + str(prog) + "%")
        sys.stdout.flush()
    elif prog >= 100:
        prog = 100
        prog2 = prog/5
        fillt = fillt + prog2
        emptt = emptt - prog2
        sys.stdout.write("\r[" + str(fillchar)*fillt + str(emptchar)*emptt + "]" + str(prog) + "%" + "\nDone!")
        sys.stdout.flush()
    elif prog < 0:
        prog = 0
        prog2 = prog/5
        fillt = fillt + prog2
        emptt = emptt - prog2
        sys.stdout.write("\r[" + str(fillchar)*fillt + str(emptchar)*emptt + "]" + str(prog) + "%" + "\nHalted!")
        sys.stdout.flush()

Artıları:

  • 20 karakter çubuğu (her 5 için 1 karakter (akıllıca)
  • Özel dolgu karakterleri
  • Özel boş karakterler
  • Durdur (0'ın altındaki herhangi bir sayı)
  • Yapıldı (100 ve 100'ün üzerindeki herhangi bir sayı)
  • İlerleme sayısı (0-100 (aşağıda ve yukarıda özel işlevler için kullanılır))
  • Çubuğun yanındaki yüzde sayısı ve tek bir satır

Eksileri:

  • Destekler tamsayılar sadece (o yüzden değiştirmek bölünme bir tamsayı bölme yaparak, gerçi onları desteklemek için değiştirilebilir prog2 = prog/5içinprog2 = int(prog/5) )

0

İşte benim Python 3 çözümüm:

import time
for i in range(100):
    time.sleep(1)
    s = "{}% Complete".format(i)
    print(s,end=len(s) * '\b')

'\ b', dizenizdeki her karakter için ters eğik çizgidir. Bu, Windows cmd penceresinde çalışmaz.


0

2.7 için Greenstick fonksiyonu:

def printProgressBar (iteration, total, prefix = '', suffix = '',decimals = 1, length = 100, fill = '#'):

percent = ("{0:." + str(decimals) + "f}").format(100 * (iteration / float(total)))
filledLength = int(length * iteration // total)
bar = fill * filledLength + '-' * (length - filledLength)
print'\r%s |%s| %s%% %s' % (prefix, bar, percent, suffix),
sys.stdout.flush()
# Print New Line on Complete                                                                                                                                                                                                              
if iteration == total:
    print()

0

Python modülü ilerleme çubuğu iyi bir seçimdir. İşte benim tipik kod:

import time
import progressbar

widgets = [
    ' ', progressbar.Percentage(),
    ' ', progressbar.SimpleProgress(format='(%(value_s)s of %(max_value_s)s)'),
    ' ', progressbar.Bar('>', fill='.'),
    ' ', progressbar.ETA(format_finished='- %(seconds)s  -', format='ETA: %(seconds)s', ),
    ' - ', progressbar.DynamicMessage('loss'),
    ' - ', progressbar.DynamicMessage('error'),
    '                          '
]

bar = progressbar.ProgressBar(redirect_stdout=True, widgets=widgets)
bar.start(100)
for i in range(100):
    time.sleep(0.1)
    bar.update(i + 1, loss=i / 100., error=i)
bar.finish()
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.