Текст Progress Bar в консоли [закрыто]


435

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

Я хотел бы, чтобы приложение показывало некоторую визуализацию процесса загрузки / выгрузки для пользователя; Каждый раз, когда загружается блок данных, я хотел бы, чтобы он предоставлял обновление прогресса, даже если это просто числовое представление в виде процента.

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

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


Хм, похоже на дубликат этого вопроса, заданного вчера: stackoverflow.com/questions/3160699/python-progress-bar/3162864 Итак, вы должны использовать fish pypi.python.org/pypi/fish
Этьен

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

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

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

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

Ответы:


465

Простой, настраиваемый индикатор выполнения

Вот совокупность многих ответов ниже, которые я регулярно использую (импорт не требуется).

# 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
Чтобы это работало в некоторых IDE (например, 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%
Гленн Дэйтон

10
@moose Это расшифровывается как «Off by one bug»
Гленн Дэйтон


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. С printI получил новые строки.
Джилл Бейтс

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

10
в python3 используйте print (...., end = ''), и у вас не будет
новых

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 ()" в конец функции.
Ромрубен

для меня это идет в новой линии
GM

@GM, какую ОС / платформу вы используете?
Владимир Игнатьев

Я не знаю, почему, если я запускаю его из spyder ide, он не работает, но если я запускаю его из консоли ipython, это работает!
GM

62

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

$ 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

Я понимаю, что опаздываю к игре, но вот немного написанную в стиле Yum (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модуль, чтобы сделать вещи проще :)

[править] Возможно, проще не слово для проклятий. Но если вы хотите создать полноценную кухню, проклятия позаботятся о многих вещах для вас.

[править] Поскольку старая ссылка не работает, я установил собственную версию Progressbar Python, получите ее здесь: 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

Мне это нравится!!! Довольно прост в использовании !!! Спасибо
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()

ПРИМЕЧАНИЕ: если вы запустите это в интерактивном interepter, вы получите дополнительные номера распечатаны


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

Код для индикатора выполнения терминала Python

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» - это обратный слеш для каждого символа в вашей строке. Это не работает в окне Windows cmd.


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

Прогресс- модуль Python - хороший выбор. Вот мой типичный код:

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.