Describes how to organize the progress bar of the console in Python.

Source: Internet
Author: User

Describes how to organize the progress bar of the console in Python.

This article describes how to display the progress bar in Python. It is a very practical technique in Python programming. Share it with you for your reference. The specific method is as follows:

First, what is the difference between a progress bar and a general print?

The answer is that print will output A \ n, that is, a line break, so that the cursor moves to the beginning of the next line, and then the output, the previous output through stdout is still retained, and make sure that we can see the latest output results below.

Otherwise, we must output the progress bar again to ensure that it is a progress bar. Otherwise, how can we call it a progress bar after a line break?

The simplest way is to move the cursor to the beginning of the line and output a longer progress bar. The new longer progress bar overwrites the old one, the animation effect is formed.

You can think of the escape character, that is \ r.

The Escape Character r moves the cursor to the beginning of the line without line breaks. The Escape Character n moves the cursor to the beginning of the line and line breaks.

In python, stdout (standard output) can be output using sys. stdout. write

For example:

#!/usr/bin/env python# -*- coding=utf-8 -*-#Using GPL v2#Author: ihipop@gmail.com##2010-10-27 22:07"""Usage:Just A Template"""from __future__ import divisionimport sys,timej = '#'if __name__ == '__main__':  for i in range(1,61):    j += '#'    sys.stdout.write(str(int((i/60)*100))+'% ||'+j+'->'+"\r")    sys.stdout.flush()    time.sleep(0.5)print

The second approach is to use the Escape Character \ B

Escape Character \ B is the return key, that is, to move the cursor of the output back to the grid, so that you do not need to + =, for example:

#!/usr/bin/env python# -*- coding=utf-8 -*-#Using GPL v2#Author: ihipop@gmail.com#2010-10-27 22:07"""Usage:Just A Template"""from __future__ import divisionimport sys,timeif __name__ == '__main__':  for i in range(1,61):    sys.stdout.write('#'+'->'+"\b\b")    sys.stdout.flush()    time.sleep(0.5)print

Move the cursor back to 2 cells, write one. # Roll back and write again to achieve the goal of growth.

However, writing so much seems to be nonsense. I often hear a sentence in my ear: do not duplicate the wheel. In fact, python has rich development lib to help you implement this. You can focus on logical development without having to pay attention to these small details.

The following describes the class "progressbar". You can easily install this class library using easy_install. In fact, you can import the class library to the same directory of the file.

As shown in:

The following is a basic example:

#! /Usr/bin/env python #-*-coding = UTF-8-*-# Using GPL v2 # Author: ihipop@gmail.com # "Usage: just A Template "from _ future _ import divisionimport sys, timefrom progressbar import * total = 1000 # basic usage progress = ProgressBar () for I in progress (range (total): time. sleep (0.01) pbar = ProgressBar (). start () for I in range (1,1000): pbar. update (int (I/(total-1) * 100) time. sleep (0.01) pbar. finish () # advanced usage widgets = ['ss SS: ', Percentage (), '', Bar (marker = RotatingMarker ('>-= ')),'', ETA (), '', FileTransferSpeed ()] pbar = ProgressBar (widgets = widgets, maxval = 10000000 ). start () for I in range (1000000): # do something pbar. update (10 * I + 1) time. sleep (0.0001) pbar. finish ()

Example: http://code.google.com/p/python-progressbar/source/browse/progressbar/examples.py

# coding:utf-8import sysimport timefrom progressbar import AnimatedMarker, Bar, BouncingBar, Counter, ETA, \  FileTransferSpeed, FormatLabel, Percentage, \  ProgressBar, ReverseBar, RotatingMarker, \  SimpleProgress, Timerexamples = []def example(fn):  try:    name = 'Example %d' % int(fn.__name__[7:])  except:    name = fn.__name__  def wrapped():    try:      sys.stdout.write('Running: %s\n' % name)      fn()      sys.stdout.write('\n')    except KeyboardInterrupt:      sys.stdout.write('\nSkipping example.\n\n')  examples.append(wrapped)  return wrapped@exampledef example0():  pbar = ProgressBar(widgets=[Percentage(), Bar()], maxval=300).start()  for i in range(300):    time.sleep(0.01)    pbar.update(i + 1)  pbar.finish()@exampledef example1():  widgets = ['Test: ', Percentage(), ' ', Bar(marker=RotatingMarker()),        ' ', ETA(), ' ', FileTransferSpeed()]  pbar = ProgressBar(widgets=widgets, maxval=10000000).start()  for i in range(1000000):    # do something    pbar.update(10 * i + 1)  pbar.finish()@exampledef example2():  class CrazyFileTransferSpeed(FileTransferSpeed):    """It's bigger between 45 and 80 percent."""    def update(self, pbar):      if 45 < pbar.percentage() < 80:        return 'Bigger Now ' + FileTransferSpeed.update(self, pbar)      else:        return FileTransferSpeed.update(self, pbar)  widgets = [CrazyFileTransferSpeed(), ' <<<', Bar(), '>>> ',        Percentage(), ' ', ETA()]  pbar = ProgressBar(widgets=widgets, maxval=10000000)  # maybe do something  pbar.start()  for i in range(2000000):    # do something    pbar.update(5 * i + 1)  pbar.finish()@exampledef example3():  widgets = [Bar('>'), ' ', ETA(), ' ', ReverseBar('<')]  pbar = ProgressBar(widgets=widgets, maxval=10000000).start()  for i in range(1000000):    # do something    pbar.update(10 * i + 1)  pbar.finish()@exampledef example4():  widgets = ['Test: ', Percentage(), ' ',        Bar(marker='0', left='[', right=']'),        ' ', ETA(), ' ', FileTransferSpeed()]  pbar = ProgressBar(widgets=widgets, maxval=500)  pbar.start()  for i in range(100, 500 + 1, 50):    time.sleep(0.2)    pbar.update(i)  pbar.finish()@exampledef example5():  pbar = ProgressBar(widgets=[SimpleProgress()], maxval=17).start()  for i in range(17):    time.sleep(0.2)    pbar.update(i + 1)  pbar.finish()@exampledef example6():  pbar = ProgressBar().start()  for i in range(100):    time.sleep(0.01)    pbar.update(i + 1)  pbar.finish()@exampledef example7():  pbar = ProgressBar() # Progressbar can guess maxval automatically.  for i in pbar(range(80)):    time.sleep(0.01)@exampledef example8():  pbar = ProgressBar(maxval=80) # Progressbar can't guess maxval.  for i in pbar((i for i in range(80))):    time.sleep(0.01)@exampledef example9():  pbar = ProgressBar(widgets=['Working: ', AnimatedMarker()])  for i in pbar((i for i in range(50))):    time.sleep(.08)@exampledef example10():  widgets = ['Processed: ', Counter(), ' lines (', Timer(), ')']  pbar = ProgressBar(widgets=widgets)  for i in pbar((i for i in range(150))):    time.sleep(0.1)@exampledef example11():  widgets = [FormatLabel('Processed: %(value)d lines (in: %(elapsed)s)')]  pbar = ProgressBar(widgets=widgets)  for i in pbar((i for i in range(150))):    time.sleep(0.1)@exampledef example12():  widgets = ['Balloon: ', AnimatedMarker(markers='.oO<a href="http://www.jobbole.com/members/weiboyes8848" rel="external nofollow" >@*</a> ')]  pbar = ProgressBar(widgets=widgets)  for i in pbar((i for i in range(24))):    time.sleep(0.3)@exampledef example13():  # You may need python 3.x to see this correctly  try:    widgets = ['Arrows: ', AnimatedMarker(markers='←↑→↓')]    pbar = ProgressBar(widgets=widgets)    for i in pbar((i for i in range(24))):      time.sleep(0.3)  except UnicodeError:    sys.stdout.write('Unicode error: skipping example')@exampledef example14():  # You may need python 3.x to see this correctly  try:    widgets = ['Arrows: ', AnimatedMarker(markers='◢◣◤◥')]    pbar = ProgressBar(widgets=widgets)    for i in pbar((i for i in range(24))):      time.sleep(0.3)  except UnicodeError:    sys.stdout.write('Unicode error: skipping example')@exampledef example15():  # You may need python 3.x to see this correctly  try:    widgets = ['Wheels: ', AnimatedMarker(markers='◐◓◑◒')]    pbar = ProgressBar(widgets=widgets)    for i in pbar((i for i in range(24))):      time.sleep(0.3)  except UnicodeError:    sys.stdout.write('Unicode error: skipping example')@exampledef example16():  widgets = [FormatLabel('Bouncer: value %(value)d - '), BouncingBar()]  pbar = ProgressBar(widgets=widgets)  for i in pbar((i for i in range(180))):    time.sleep(0.05)@exampledef example17():  widgets = [FormatLabel('Animated Bouncer: value %(value)d - '),        BouncingBar(marker=RotatingMarker())]  pbar = ProgressBar(widgets=widgets)  for i in pbar((i for i in range(180))):    time.sleep(0.05)@exampledef example18():  widgets = [Percentage(),        ' ', Bar(),        ' ', ETA(),        ' ', AdaptiveETA()]  pbar = ProgressBar(widgets=widgets, maxval=500)  pbar.start()  for i in range(500):    time.sleep(0.01 + (i < 100) * 0.01 + (i > 400) * 0.9)    pbar.update(i + 1)  pbar.finish()@exampledef example19():  pbar = ProgressBar()  for i in pbar([]):    pass  pbar.finish()try:  for example in examples:    example()except KeyboardInterrupt:  sys.stdout('\nQuitting examples.\n')

Send another class:

#!/usr/bin/env python# -*- coding=utf-8 -*-#Using GPL v2#Author: ihipop@gmail.com#2010-10-30 13:59"""Usage:Just A Template"""class progressbarClass:   def __init__(self, finalcount, progresschar=None):    import sys    self.finalcount=finalcount    self.blockcount=0    #    # See if caller passed me a character to use on the    # progress bar (like "*"). If not use the block    # character that makes it look like a real progress    # bar.    #    if not progresschar: self.block=chr(178)    else:        self.block=progresschar    #    # Get pointer to sys.stdout so I can use the write/flush    # methods to display the progress bar.    #    self.f=sys.stdout    #    # If the final count is zero, don't start the progress gauge    #    if not self.finalcount : return    self.f.write('\n------------------- % Progress -------------------\n')    return  def progress(self, count):    #    # Make sure I don't try to go off the end (e.g. >100%)    #    count=min(count, self.finalcount)    #    # If finalcount is zero, I'm done    #    if self.finalcount:      percentcomplete=int(round(100*count/self.finalcount))      if percentcomplete < 1: percentcomplete=1    else:      percentcomplete=100    #print "percentcomplete=",percentcomplete    blockcount=int(percentcomplete/2)    #print "blockcount=",blockcount    if blockcount > self.blockcount:      for i in range(self.blockcount,blockcount):        self.f.write(self.block)        self.f.flush()    if percentcomplete == 100: self.f.write("\n")    self.blockcount=blockcount    returnif __name__ == "__main__":  from time import sleep  pb=progressbarClass(8,"*")  count=0  while count<9:    count+=1    pb.progress(count)    sleep(0.2)

In addition, section 11.1 of python cookbook also provides a good progress bar class. The Code is as follows:

import sysclass progressbar(object):  def __init__(self, finalcount, block_char='.'):    self.finalcount = finalcount    self.blockcount = 0    self.block = block_char    self.f = sys.stdout    if not self.finalcount:      return    self.f.write('\n------------------ % Progress -------------------1\n')    self.f.write(' 1 2 3 4 5 6 7 8 9 0\n')    self.f.write('----0----0----0----0----0----0----0----0----0----0\n')  def progress(self, count):    count = min(count, self.finalcount)    if self.finalcount:      percentcomplete = int(round(100.0 * count / self.finalcount))      if percentcomplete < 1:        percentcomplete = 1    else:      percentcomplete = 100    blockcount = int(percentcomplete // 2)    if blockcount <= self.blockcount:      return    for i in range(self.blockcount, blockcount):      self.f.write(self.block)    self.f.flush()    self.blockcount = blockcount    if percentcomplete == 100:      self.f.write("\n")if __name__ == "__main__":  from time import sleep  pb = progressbar(8, "*")  for count in range(1, 9):    pb.progress(count)    sleep(0.2)  pb = progressbar(100)  pb.progress(20)  sleep(0.3)  pb.progress(47)  sleep(0.3)  pb.progress(90)  sleep(0.3)  pb.progress(100)  print "testing 1:"  pb = progressbar(1)  pb.progress(1)

Shows the running result:

I hope this article will help you learn Python programming. We also hope that you can support the customer's home.

Related Article

Contact Us

The content source of this page is from Internet, which doesn't represent Alibaba Cloud's opinion; products and services mentioned on that page don't have any relationship with Alibaba Cloud. If the content of the page makes you feel confusing, please write us an email, we will handle the problem within 5 days after receiving your email.

If you find any instances of plagiarism from the community, please send an email to: info-contact@alibabacloud.com and provide relevant evidence. A staff member will contact you within 5 working days.

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.