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

435

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

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

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

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

bobber205
источник
Хм, похоже на дубликат этого вопроса, заданного вчера: 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

Обновить

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

Greenstick
источник
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
printесть endаргумент: stackoverflow.com/a/8436827/1959808
Иоаннис Филиппидис
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%

aviraldg
источник
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%

... где скобки остаются неизменными и увеличиваются только хэши.

Это может работать лучше в качестве декоратора. На другой день ...

JoeLinux
источник
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

Wolph
источник
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%] ===================

ashish2py
источник
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

Чаще всего это считается «чрезмерным», но это удобно, когда вы часто его используете

FraggaMuffin
источник
Спасибо за это. Небольшое исправление: метод 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.

PaulMcG
источник
4

Я использую прогресс от Reddit . Мне это нравится, потому что он может печатать прогресс для каждого элемента в одной строке и не должен стирать распечатки из программы.

Редактировать: фиксированная ссылка

Ib33X
источник
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)
Malcolm Box
источник
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='')
Сливы-Eyes
источник
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()
emd_22
источник
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.

Matt-The-Bat
источник
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()
Аймин Хуан
источник