Текстовий рядок прогресу в консолі [закрито]


435

Я написав простий консольний додаток для завантаження та завантаження файлів з FTP-сервера за допомогою ftplib.

Я хотів би, щоб програма показала деяку візуалізацію прогресу завантаження / завантаження для користувача; щоразу при завантаженні фрагмента даних я хотів би, щоб він оновлював прогрес, навіть якщо це просто числове представлення, як відсоток.

Важливо, що я хочу уникати стирання всього тексту, який був надрукований на консолі в попередніх рядках (тобто я не хочу "очищати" весь термінал під час друку оновленого ходу).

Це здається досить розповсюдженим завданням - як я можу зробити пробіл прогресу або подібну візуалізацію, яка виводиться на мою консоль, зберігаючи попередній вихід програми?


Хм, схожий на дублікат цього запитання, поставленого вчора: stackoverflow.com/questions/3160699/python-progress-bar/3162864 Отже, ви повинні використовувати рибу pypi.python.org/pypi/fish
Етьєн

29
"просто використовувати графічний інтерфейс" неправильно розуміє, що GUI чудові в деяких ситуаціях (швидка крива навчання, спеціальні пошукові або інтерактивні або разові дії), тоді як інструменти командного рядка чудово підходять для інших (експертні користувачі, які складають спеціальні програми на муха виконувати ретельно визначену операцію багато разів.)
Джонатан Хартлі

14
Я проголосував за повторне відкриття. Питання не вражає мене занадто широким.
Франк Дернонкур

Я думаю, що те, що ти шукаєш, це tqdm ... хоча я також не знаю, чому ТА пропонує мені переглянути повторно голосування щодо річних питань.
kungphu

Я опублікував новий вид смужки прогресу, який можна надрукувати, побачити пропускну здатність та ета, навіть призупинити його, окрім дуже крутих анімацій! Погляньте: github.com/rsalmei/alive-progress !
live

Відповіді:


464

Проста, налаштована панель прогресу

Ось сукупність багатьох відповідей нижче, які я регулярно використовую (не потрібно імпорту).

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

Примітка. Це для Python 3; див. коментарі для детальної інформації про використання цього в Python 2.

Використання зразка

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)

Вибірка зразка:

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

Оновлення

У коментарях було обговорено варіант, який дозволяє панелі прогресу динамічно підлаштовуватися під ширину вікна терміналу. Хоча я не рекомендую цього, ось суть, яка реалізує цю функцію (і зазначає застереження).


21
Цей фрагмент чудово працює! Я зіткнувся з парою незначних проблем, тому я вніс декілька незначних змін (PEP-8, кодування за замовчуванням для символів, які не є ascii), і кинув їх тут: gist.github.com/aubricus/f91fb55dc6ba5557fbab06119420dd6a
Aubricus

3
Варто зазначити, що декларація UTF-8 не потрібна, якщо ви не використовуєте Python 2 @Aubricus
Greenstick

2
@MattClimbs Це написано для Python 3, який використовує кодування UTF-8 за замовчуванням. Ви можете або змінити параметр заповнення за замовчуванням функції, яка є символом UTF-8, або використовувати декларацію UTF-8. Дивіться суть у коментарі вище для прикладу того, як має виглядати декларація UTF-8.
Greenstick

1
Дякую, хороший підсумок, також виявлення розміру терміналу може бути корисним для цієї функції, # Size of terminal rows, columns = [int(x) for x in os.popen('stty size', 'r').read().split()] columnsслід передати довжину, щоб відрегулювати розмір смуги прогресу до вікна терміналу. Хоча довжину прогресуючої частини бар слід зменшити (за довжиною префікса, суфікса, відсотків та додаткових символів у цьому рядку'\r%s |%s| %s%% %s'
Арлег

3
Для того, щоб отримати цю роботу в деякій Іде (наприклад , PyCharm на Windows) , можливо , буде потрібно зміна end = '\r'до end = ''.
thomas88wp

312

Запис "\ r" перемістить курсор назад на початок рядка.

Тут відображається лічильник відсотків:

import time
import sys

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

3
Вставив це і побіг. Він друкує новий рядок кожного разу. Я хочу, щоб номер оновлювався в тому ж рядку. :)
bobber205

8
Цей приклад також створює OBOB, який закінчується завантаженням99%
Glenn Dayton

10
@moose Це означає "Вимкнено однією помилкою"
Glenn Dayton


3
Щоб додати те, що сказав @IoannisFilippidis, printтакож є flushаргумент: docs.python.org/3/library/functions.html#print
Wso


113

Напишіть \rна консоль. Це "повернення каретки", яке змушує весь текст після нього лунати на початку рядка. Щось на зразок:

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

що дасть вам щось на кшталт: [ ########## ] 100%


19
Зробіть, \rа потім знову випишіть весь рядок. В основному: print("\rProgress: [{0:50s}] {1:.1f}%".format('#' * int(amtDone * 50), amtDone * 100))де amtDoneпоплавок між 0 і 1.
Майк Десимоне

13
Краще використовувати, sys.stdout.writeніж print. З printя отримав нові лінії.
Gill Bates

14
додайте кому ,в кінці printтворів для мене.
Чуньлянь Лю

10
в python3 використовуйте print (...., end = ''), і у вас не буде нових рядків
greywolf

7
Підведення підсумків для колишніх підрахунків Python3: print("\rProgress: [{0:50s}] {1:.1f}%".format('#' * int(workdone * 50), workdone*100), end="", flush=True)де workdoneпоплавок між 0 і 1, наприклад,workdone = parsed_dirs/total_dirs
khyox

70

Це менше 10 рядків коду.

Суть тут: 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

введіть тут опис зображення


2
додає "sys.stdout.flush ()" в кінець функції.
romruben

для мене це йде у новій лінійці
GM

@GM яку ОС / платформу ви використовуєте?
Володимир Ігнатьєв

Я не знаю, чому, якщо я запускаю його від шпіон-іде, він не працює, але якщо я запускаю його з консолі ipython, він працює!
GM

62

Спробуйте бібліотеку кліків, написану Моцартом Питона, Арміном Ронахером.

$ pip install click # both 2 and 3 compatible

Щоб створити просту панель прогресу:

import click

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

Ось як це виглядає:

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

Налаштуйте вміст серця:

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

Спеціальний вигляд:

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

Є ще більше варіантів, дивіться документи API :

 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

Я розумію, що я запізнююся на гру, але ось трохи написаний ям стилем (Red Hat), який я написав (не збираюся на 100% точність тут, але якщо ви використовуєте панель прогресу для цього рівня точності, то ви все-таки помилився):

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

Потрібно створити щось подібне:

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

... там, де дужки залишаються нерухомими, і збільшуються лише хеши.

Це може працювати краще як декоратор. Ще на один день ...


2
Чудове рішення! Працює чудово! Дуже дякую!
Василь Бурсак

18

Перевірте цю бібліотеку: clint

він має багато функцій, включаючи панель прогресу:

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)

це посилання забезпечує швидкий огляд його особливостей


12

Ось прекрасний приклад панелі прогресу, написаної на Python: http://nadiana.com/animated-terminal-progress-bar-in-python

Але якщо ви хочете написати це самостійно. Ви можете використовувати cursesмодуль, щоб полегшити справи :)

[ред.] Можливо, простіше не слово для прокльонів. Але якщо ви хочете створити повноцінний куй, то прокльони подбають про багато чого для вас.

[редагувати] Оскільки старе посилання мертве, я поставив власну версію програми Python Progressbar, знайдіть його тут: https://github.com/WoLpH/python-progressbar


14
curses? Легше? Хммм ....
aviraldg

Чудова стаття, я збирався надати посилання на неї, але не зміг знайти у своїх закладках :)
Енді Михайленко

@Aviral Dasgupta: Досить справедливо, простіше тут може не бути правильного слова. Це може заощадити багато роботи, але це дійсно залежить від того, що ви шукаєте.
Вольф

Не шукаючи нічого поруч із цим, але все-таки дякую. :)
bobber205

2
Мертве посилання, це ціна не розміщення вмісту посилання у вашій відповіді -__-
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()

вихід

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


7

і, просто щоб додати до палі, ось об’єкт, який ви можете використовувати

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"

призводить до:

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

Найчастіше це вважається "над верхом", але це зручно, коли ви багато використовуєте його


Дякую за це Невелике виправлення, метод plotProgress повинен використовувати рядок sys.stdout.flush (), інакше смужка прогресу може бути не намальована, поки завдання не буде виконано (як це відбувається в mac-терміналі).
osnoz

Мені це подобається!!! Досить простий у використанні !!! Thankyou
Microos

7

Встановіть tqdm. ( pip install tqdm) Та використовуйте його наступним чином:

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

Це 10-секундний рядок ходу, який виведе щось подібне:

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

6

Виконайте це в командному рядку Python ( не в будь-якому середовищі IDE або розробника):

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

Добре працює в моїй системі Windows.



4

Я використовую прогрес від reddit . Мені це подобається, оскільки він може надрукувати прогрес для кожного елемента в одному рядку, і він не повинен видаляти роздруківки з програми.

Редагувати: фіксоване посилання


1
Ваше посилання порушено - фактичний рядок у вихідному коді 1274-й, а не 1124-й! Отже, правильне посилання саме на це: github.com/reddit/reddit/blob/master/r2/r2/lib/utils/…
Володимир Ігнатьєв

Цей варіант має найкращий дизайн на мій смак: він використовує ітератори та працює, можливо, з будь-якими вимірними роботами, показує минулий час.
Володимир Ігнатьєв


3

Грунтуючись на вищенаведених відповідях та інших подібних питаннях щодо панелі прогресу CLI, я думаю, що я отримав загальну загальну відповідь на всі вони. Перевірте це за адресою https://stackoverflow.com/a/15860757/2254146

Підсумовуючи, код такий:

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

Виглядає як

Відсоток: [##########] 99,0%


3

Я рекомендую використовувати tqdm - https://pypi.python.org/pypi/tqdm - що спрощує перетворення будь-якого ітерабельного або процесу в панель прогресу, а також обробляє всі проблеми, що потрібні терміналам.

З документації: "tqdm може легко підтримувати зворотні дзвінки / гачки та оновлення вручну. Ось приклад із urllib"

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

Дуже просте рішення - ввести цей код у свою петлю:

Помістіть це в тілі (тобто вгорі) вашого файлу:

import sys

Покладіть це в тіло своєї петлі:

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

ПРИМІТКА: якщо запустити це в інтерактивному інтерптері, ви отримаєте надруковані додаткові номери


2

LOL, я просто написав все, що для цього є ось код, майте на увазі, що ви не можете використовувати Unicode, роблячи блок ascii, я використовую cp437

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

і ти називаєш це так

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

так це виглядає приблизно так

loading something awesome
|█████     |

2

Зі своїми чудовими порадами я опрацьовую панель прогресу.

Однак я хотів би зазначити деякі недоліки

  1. Щоразу, коли смужка прогресу змивається, вона починається на новому рядку

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

    так:
    [] 0%
    [#] 10%
    [##] 20%
    [###] 30%

2. Квадратна дужка ']' та відсотковий номер у правій частині зсуву праворуч, оскільки «###» збільшується.
3. Помилка стане, якщо вираз 'progress / 10' не може повернути ціле число.

І наступний код виправить проблему вище.

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

1

Код для панелі прогресу терміналу пітона

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

я написав просту панель прогресу:

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)

як ви бачите, він має: довжину бар, префікс і суфікс, наповнювач, пробіл, текст у рядку на 100% (oncomp) та межі

ось приклад:

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)

незавершене:

30% [######              ]

завершено:

100% [   done in 9 sec   ] 

1

Збираючи разом деякі ідеї, які я знайшов тут, і додаючи приблизний час:

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

Для пітона 3:

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

Ну ось код, який працює, і я тестував його перед публікацією:

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

Плюси:

  • 20 символьних рядків (1 символ на кожні 5 (число мудрий))
  • Спеціальні символи заповнення
  • Нестандартні порожні символи
  • Стоп (будь-яке число нижче 0)
  • Готово (100 та будь-яке число вище 100)
  • Кількість прогресів (0-100 (нижче та вище використовується для спеціальних функцій))
  • Відсоткове число поруч із рядком, і це один рядок

Мінуси:

  • Підтримує лише цілі числа (Його можна модифікувати, щоб підтримувати їх, хоча, зробивши поділ цілим числом, тож просто змініть prog2 = prog/5на prog2 = int(prog/5))

0

Ось моє рішення Python 3:

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

'\ b' - це зворотний проріз для кожного символу рядка. Це не працює у вікні cmd Windows.


0

функція від Greenstick для 2.7:

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

Панель прогресу модуля пітона є приємним вибором. Ось мій типовий код:

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()
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.