Text Progress Bar in the Console [closed] Text Progress Bar in the Console [closed] python python

Text Progress Bar in the Console [closed]


Python 3

A Simple, Customizable Progress Bar

Here's an aggregate of many of the answers below that I use regularly (no imports required).

Note: All code in this answer was created for Python 3; see end of answer to use this code with Python 2.

# Print iterations progressdef 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(f'\r{prefix} |{bar}| {percent}% {suffix}', end = printEnd)    # Print New Line on Complete    if iteration == total:         print()

Sample Usage

import time# A List of Itemsitems = list(range(0, 57))l = len(items)# Initial call to print 0% progressprintProgressBar(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)

Sample Output

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

Update

There was discussion in the comments regarding an option that allows the progress bar to adjust dynamically to the terminal window width. While I don't recommend this, here's a gist that implements this feature (and notes the caveats).

Single-Call Version of The Above

A comment below referenced a nice answer posted in response to a similar question. I liked the ease of use it demonstrated and wrote a similar one, but opted to leave out the import of the sys module while adding in some of the features of the original printProgressBar function above.

Some benefits of this approach over the original function above include the elimination of an initial call to the function to print the progress bar at 0% and the use of enumerate becoming optional (i.e. it is no longer explicitly required to make the function work).

def progressBar(iterable, prefix = '', suffix = '', decimals = 1, length = 100, fill = '█', printEnd = "\r"):    """    Call in a loop to create terminal progress bar    @params:        iterable    - Required  : iterable object (Iterable)        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)    """    total = len(iterable)    # Progress Bar Printing Function    def printProgressBar (iteration):        percent = ("{0:." + str(decimals) + "f}").format(100 * (iteration / float(total)))        filledLength = int(length * iteration // total)        bar = fill * filledLength + '-' * (length - filledLength)        print(f'\r{prefix} |{bar}| {percent}% {suffix}', end = printEnd)    # Initial Call    printProgressBar(0)    # Update Progress Bar    for i, item in enumerate(iterable):        yield item        printProgressBar(i + 1)    # Print New Line on Complete    print()

Sample Usage

import time# A List of Itemsitems = list(range(0, 57))# A Nicer, Single-Call Usagefor item in progressBar(items, prefix = 'Progress:', suffix = 'Complete', length = 50):    # Do stuff...    time.sleep(0.1)

Sample Output

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

Python 2

To use the above functions in Python 2, set the encoding to UTF-8 at the top of your script:

# -*- coding: utf-8 -*-

And replace the Python 3 string formatting in this line:

print(f'\r{prefix} |{bar}| {percent}% {suffix}', end = printEnd)

With Python 2 string formatting:

print('\r%s |%s| %s%% %s' % (prefix, bar, percent, suffix), end = printEnd)


Writing '\r' will move the cursor back to the beginning of the line.

This displays a percentage counter:

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


tqdm: add a progress meter to your loops in a second:

>>> import time>>> from tqdm import tqdm>>> for i in tqdm(range(100)):...     time.sleep(1)... |###-------| 35/100  35% [elapsed: 00:35 left: 01:05,  1.00 iters/sec]

tqdm repl session