Python Progress Bar

后端 未结 30 2821
礼貌的吻别
礼貌的吻别 2020-11-22 06:13

How do I use a progress bar when my script is doing some task that is likely to take time?

For example, a function which takes some time to complete and returns

30条回答
  •  傲寒
    傲寒 (楼主)
    2020-11-22 06:58

    I've just made a simple progress class for my needs after searching here for a equivalent solution. I thought I might a well post it.

    from __future__ import print_function
    import sys
    import re
    
    
    class ProgressBar(object):
        DEFAULT = 'Progress: %(bar)s %(percent)3d%%'
        FULL = '%(bar)s %(current)d/%(total)d (%(percent)3d%%) %(remaining)d to go'
    
        def __init__(self, total, width=40, fmt=DEFAULT, symbol='=',
                     output=sys.stderr):
            assert len(symbol) == 1
    
            self.total = total
            self.width = width
            self.symbol = symbol
            self.output = output
            self.fmt = re.sub(r'(?P%\(.+?\))d',
                r'\g%dd' % len(str(total)), fmt)
    
            self.current = 0
    
        def __call__(self):
            percent = self.current / float(self.total)
            size = int(self.width * percent)
            remaining = self.total - self.current
            bar = '[' + self.symbol * size + ' ' * (self.width - size) + ']'
    
            args = {
                'total': self.total,
                'bar': bar,
                'current': self.current,
                'percent': percent * 100,
                'remaining': remaining
            }
            print('\r' + self.fmt % args, file=self.output, end='')
    
        def done(self):
            self.current = self.total
            self()
            print('', file=self.output)
    

    Example :

    from time import sleep
    
    progress = ProgressBar(80, fmt=ProgressBar.FULL)
    
    for x in xrange(progress.total):
        progress.current += 1
        progress()
        sleep(0.1)
    progress.done()
    

    Will print the following:

    [======== ] 17/80 ( 21%) 63 to go

提交回复
热议问题