Python to print out status bar and percentage

后端 未结 20 1035
野的像风
野的像风 2020-11-28 01:01

To implement a status bar like below:

[==========                ]  45%
[================          ]  60%
[==========================] 100%

相关标签:
20条回答
  • 2020-11-28 01:14

    I came upon this thread today and after having tried out this solution from Mark Rushakoff

    from time import sleep
    import sys
    
    for i in range(21):
    sys.stdout.write('\r')
    # the exact output you're looking for:
    sys.stdout.write("[%-20s] %d%%" % ('='*i, 5*i))
    sys.stdout.flush()
    sleep(0.25)
    

    I can say that this works fine on W7-64 with python 3.4.3 64-bit but only in the native console. However when using the built-in console of spyder 3.0.0dev, the line breaks are still/again present. As this took me some time to figure out, I'd like to report this observation here.

    0 讨论(0)
  • 2020-11-28 01:17

    This is quite a simple approach can be used with any loop.

    #!/usr/bin/python
    for i in range(100001):
        s =  ((i/5000)*'#')+str(i)+(' %')
        print ('\r'+s),
    
    0 讨论(0)
  • I found useful library tqdm (https://github.com/tqdm/tqdm/, previously: https://github.com/noamraph/tqdm). It automatically estimates time of completion and can be used as iterator.

    Usage:

    import tqdm
    import time
    
    for i in tqdm.tqdm(range(1000)):
        time.sleep(0.01)
        # or other long operations
    

    Results in:

    |####------| 450/1000  45% [elapsed: 00:04 left: 00:05, 99.15 iters/sec]
    

    tqdm can wrap any iterable.

    0 讨论(0)
  • 2020-11-28 01:20

    To be pure python and not make system calls:

    from time import sleep
    
    for i in range(21):
        spaces = " " * (20 - i)
        percentage = 5*i
        print(f"\r[{'='*i}{spaces}]{percentage}%", flush=True, end="")
        sleep(0.25)
    
    0 讨论(0)
  • 2020-11-28 01:22
    def printProgressBar(value,label):
        n_bar = 40 #size of progress bar
        max = 100
        j= value/max
        sys.stdout.write('\r')
        bar = '█' * int(n_bar * j)
        bar = bar + '-' * int(n_bar * (1-j))
    
        sys.stdout.write(f"{label.ljust(10)} | [{bar:{n_bar}s}] {int(100 * j)}% ")
        sys.stdout.flush()
    

    call:

    printProgressBar(30,"IP")
    

    IP | [████████████----------------------------] 30%

    0 讨论(0)
  • 2020-11-28 01:24

    If you are developing a command line interface, I suggest you to take a look at click which is very nice:

    import click
    import time
    
    for filename in range(3):
        with click.progressbar(range(100), fill_char='=', empty_char=' ') as bar:
            for user in bar:
                time.sleep(0.01)
    

    Here the output you get:

    $ python test.py
      [====================================]  100%
      [====================================]  100%
      [=========                           ]   27%
    
    0 讨论(0)
提交回复
热议问题