Progress Bar in Python Console on Windows

夙愿已清 提交于 2019-12-11 04:00:47

问题


I have gone through the below two links in addition to some others and I have tried most all examples and suggestions provided, but in my output the progress bar is not getting updated, rather new one shows, either end of same line or alternately on the new line. What am I missing here, can someone please guide me.

Python Progress Bar

Text Progress Bar in the Console

For ease, I am reproducing some of the codes (from examples of above threads) I have tried and their outputs. Did I understand incorrect that it will update the same line or what am I missing. Appreciate your help. I am using Python 3.4 on Windows 7 and getting the output on console (no GUI).

Example 1:

import progressbar
import time, sys

progress = progressbar.ProgressBar()
for i in progress(range(80)):
    time.sleep(0.01)

Output 1:

>>> 
  0% |                                                                        |
  1% |                                                                        |
  2% |#                                                                       |
  3% |##                                                                      |
  5% |###                                                                     |
  6% |####                                                                    |
  7% |#####                                                                   |
  8% |######                                                                  |
 10% |#######                                                                 |
 11% |########                                                                |
 12% |#########                                                               |
 13% |#########                                                               |
 15% |##########                                                              |
 16% |###########                                                             |
 17% |############                                                            |
 18% |#############                                                           |
 20% |##############                                                          |
 21% |###############                                                         |
 22% |################                                                        |
 23% |#################                                                       |
 25% |##################                                                      |
 26% |##################                                                      |
 27% |###################                                                     |
 28% |####################                                                    |
 30% |#####################                                                   |
 31% |######################                                                  |
 32% |#######################                                                 |
 33% |########################                                                |
 35% |#########################                                               |
 36% |##########################                                              |
 37% |###########################                                             |
 38% |###########################                                             |
 40% |############################                                            |
 41% |#############################                                           |
 42% |##############################                                          |
 43% |###############################                                         |
 45% |################################                                        |
 46% |#################################                                       |
 47% |##################################                                      |
 48% |###################################                                     |
 50% |####################################                                    |
 51% |####################################                                    |
 52% |#####################################                                   |
 53% |######################################                                  |
 55% |#######################################                                 |
 56% |########################################                                |
 57% |#########################################                               |
 58% |##########################################                              |
 60% |###########################################                             |
 61% |############################################                            |
 62% |#############################################                           |
 63% |#############################################                           |
 65% |##############################################                          |
 66% |###############################################                         |
 67% |################################################                        |
 68% |#################################################                       |
 70% |##################################################                      |
 71% |###################################################                     |
 72% |####################################################                    |
 73% |#####################################################                   |
 75% |######################################################                  |
 76% |######################################################                  |
 77% |#######################################################                 |
 78% |########################################################                |
 80% |#########################################################               |
 81% |##########################################################              |
 82% |###########################################################             |
 83% |############################################################            |
 85% |#############################################################           |
 86% |##############################################################          |
 87% |###############################################################         |
 88% |###############################################################         |
 90% |################################################################        |
 91% |#################################################################       |
 92% |##################################################################      |
 93% |###################################################################     |
 95% |####################################################################    |
 96% |#####################################################################   |
 97% |######################################################################  |
 98% |####################################################################### |
100% |########################################################################|

Example 2:

for i in range(0, 101, 10):
  sys.stdout.write('\r>> You have finished %3d%%\r' % i)
  sys.stdout.flush()
  sys.stdout.flush()
  time.sleep(1)
print

Output 2:

You have finished 0% >> You have finished 10% >> You have finished 20% >> You have finished 30% >> You have finished 40% >> You have finished 50% >> You have finished 60% >> You have finished 70% >> You have finished 80% >> You have finished 90% >> You have finished 100%

Example 3:

def update_progress(progress):
    barLength = 20 # 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()

print("")
print("progress : 0->1")
for i in range(101):
    time.sleep(0.1)
    update_progress(i/100.0)

print("")
print("Test completed")
time.sleep(1)

Output 3:

>>> 

progress : 0->1

Percent: [                    ] 0.0% 
Percent: [                    ] 1.0% 
Percent: [                    ] 2.0% 
Percent: [=                   ] 3.0% 
Percent: [=                   ] 4.0% 
Percent: [=                   ] 5.0% 
Percent: [=                   ] 6.0% 
Percent: [=                   ] 7.000000000000001% 
Percent: [==                  ] 8.0% 
Percent: [==                  ] 9.0% 
Percent: [==                  ] 10.0% 
Percent: [==                  ] 11.0% 
Percent: [==                  ] 12.0% 
Percent: [===                 ] 13.0% 
Percent: [===                 ] 14.000000000000002% 
Percent: [===                 ] 15.0% 
Percent: [===                 ] 16.0% 
Percent: [===                 ] 17.0% 
Percent: [====                ] 18.0% 
Percent: [====                ] 19.0% 
Percent: [====                ] 20.0% 
Percent: [====                ] 21.0% 
Percent: [====                ] 22.0% 
Percent: [=====               ] 23.0% 
Percent: [=====               ] 24.0% 
Percent: [=====               ] 25.0% 
Percent: [=====               ] 26.0% 
Percent: [=====               ] 27.0% 
Percent: [======              ] 28.000000000000004% 
Percent: [======              ] 28.999999999999996% 
Percent: [======              ] 30.0% 
Percent: [======              ] 31.0% 
Percent: [======              ] 32.0% 
Percent: [=======             ] 33.0% 
Percent: [=======             ] 34.0% 
Percent: [=======             ] 35.0% 
Percent: [=======             ] 36.0% 
Percent: [=======             ] 37.0% 
Percent: [========            ] 38.0% 
Percent: [========            ] 39.0% 
Percent: [========            ] 40.0% 
Percent: [========            ] 41.0% 
Percent: [========            ] 42.0% 
Percent: [=========           ] 43.0% 
Percent: [=========           ] 44.0% 
Percent: [=========           ] 45.0% 
Percent: [=========           ] 46.0% 
Percent: [=========           ] 47.0% 
Percent: [==========          ] 48.0% 
Percent: [==========          ] 49.0% 
Percent: [==========          ] 50.0% 
Percent: [==========          ] 51.0% 
Percent: [==========          ] 52.0% 
Percent: [===========         ] 53.0% 
Percent: [===========         ] 54.0% 
Percent: [===========         ] 55.00000000000001% 
Percent: [===========         ] 56.00000000000001% 
Percent: [===========         ] 56.99999999999999% 
Percent: [============        ] 57.99999999999999% 
Percent: [============        ] 59.0% 
Percent: [============        ] 60.0% 
Percent: [============        ] 61.0% 
Percent: [============        ] 62.0% 
Percent: [=============       ] 63.0% 
Percent: [=============       ] 64.0% 
Percent: [=============       ] 65.0% 
Percent: [=============       ] 66.0% 
Percent: [=============       ] 67.0% 
Percent: [==============      ] 68.0% 
Percent: [==============      ] 69.0% 
Percent: [==============      ] 70.0% 
Percent: [==============      ] 71.0% 
Percent: [==============      ] 72.0% 
Percent: [===============     ] 73.0% 
Percent: [===============     ] 74.0% 
Percent: [===============     ] 75.0% 
Percent: [===============     ] 76.0% 
Percent: [===============     ] 77.0% 
Percent: [================    ] 78.0% 
Percent: [================    ] 79.0% 
Percent: [================    ] 80.0% 
Percent: [================    ] 81.0% 
Percent: [================    ] 82.0% 
Percent: [=================   ] 83.0% 
Percent: [=================   ] 84.0% 
Percent: [=================   ] 85.0% 
Percent: [=================   ] 86.0% 
Percent: [=================   ] 87.0% 
Percent: [==================  ] 88.0% 
Percent: [==================  ] 89.0% 
Percent: [==================  ] 90.0% 
Percent: [==================  ] 91.0% 
Percent: [==================  ] 92.0% 
Percent: [=================== ] 93.0% 
Percent: [=================== ] 94.0% 
Percent: [=================== ] 95.0% 
Percent: [=================== ] 96.0% 
Percent: [=================== ] 97.0% 
Percent: [====================] 98.0% 
Percent: [====================] 99.0% 
Percent: [====================] 100% Done...


Test completed
>>> 

Edit: You can see that printing on the same line is happening, but it is appending at the end of the last print rather than overwriting which is the desired effect. Thanks!


回答1:


>>> import time
>>> for i in range(0, 101, 10):
...     print('\rYou have finished %3d%%' % i, end='', flush=True)
...     time.sleep(1)
... else:
...     print()
...
You have finished 100%
>>>

works for me with Python 3.4.3 on win32...

Idle doesn't render carriage returns properly.

Look into python print one line same space. "done, my mistake i was using IDLE" or Implementing a backspace in Python 3.3.2 Shell using Idle.

Idle is more like a Python text editor and no real console... therefore you cannot interpret a control symbol and print it properly at the same time...

>>> print("asd\rfgh")
asdfgh



回答2:


Here's a class I use in my applications. Works on Windows 7 for me.

Check if percentage changed not to re-print on every iteration, print() is heavy operation

class ProgressBar:
    """
    Create command-line-style ProgressBar
    """
    def __init__(self, total, prefix='', suffix='', length=100, fill='*'):
        """
        Init ProgressBar
        Start position is always 0, end position is total.
        Usage example:
        progress_bar = ProgressBar(l, prefix='Progress:', suffix='Complete', length=50)
        while some():
            progress_bar.iterate(i + 1)
        :param total: Required, total iterations (Int)
        :param prefix: Optional, prefix string (Str)
        :param suffix: Optional, suffix string (Str)
        :param length: Optional, character length of bar (Int)
        :param fill: Optional, bar fill character (Str)
        """
        self.counter = 0
        self.prev_counter = 0
        self.total = total
        self.percent_size = total/100
        self.prefix = prefix
        self.suffix = suffix
        self.length = length
        self.fill = fill

    def iterate(self, iteration):
        """
        Call in a loop to create terminal progress bar
        @param: iteration: Required, current iteration (Int)
        """
        self.prev_counter = int(iteration/self.percent_size)
        filled_length = int((self.prev_counter/100) * self.length)
        bar = self.fill * filled_length + '-' * (self.length - filled_length)
        if self.prev_counter != self.counter:
            print('\r%s |%s| %s%% %s' % (self.prefix, bar, self.prev_counter, self.suffix), end='\r')
        self.counter = self.prev_counter
        # Print New Line on Complete
        if iteration == self.total:
            print()


来源:https://stackoverflow.com/questions/32197618/progress-bar-in-python-console-on-windows

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!