Python显示进度条的方法


Posted in Python onSeptember 20, 2014

本文实例讲述了Python显示进度条的方法,是Python程序设计中非常实用的技巧。分享给大家供大家参考。具体方法如下:

首先,进度条和一般的print区别在哪里呢?

答案就是print会输出一个\n,也就是换行符,这样光标移动到了下一行行首,接着输出,之前已经通过stdout输出的东西依旧保留,而且保证我们在下面看到最新的输出结果。

进度条不然,我们必须再原地输出才能保证他是一个进度条,否则换行了怎么还叫进度条?

最简单的办法就是,再输出完毕后,把光标移动到行首,继续在那里输出更长的进度条即可实现,新的更长的进度条把旧的短覆盖,就形成了动画效果。

可以想到那个转义符了吧,那就是 \r。

转义符\r就可以把光标移动到行首而不换行,转义符\n就把光标移动到行首并且换行。

在python中,输出stdout(标准输出)可以使用sys.stdout.write
例如:

#!/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 division
 
import sys,time
j = '#'
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

第二种思路是用转义符\b
转义符\b是退格键,也就是说把输出的光标往回退格子,这样就可以不用+=了,例如:

#!/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 division
 
import sys,time
if __name__ == '__main__':
  for i in range(1,61):
    sys.stdout.write('#'+'->'+"\b\b")
    sys.stdout.flush()
    time.sleep(0.5)
print

光标回退2格,写个#再回退,再写,达到增长的目的了

不过写这么多似乎是废话,在耳边常常听到一句话:那就是不要重复造轮子。实际上python有丰富发lib帮你实现这个东西,你完全可以把心思放在逻辑开发上而不用注意这些小细节

下面要介绍的就是这个类“progressbar”(http://code.google.com/p/python-progressbar/),使用easy_install可以方便的安装这个类库,其实就一个文件,拿过来放到文件同一个目录下面也直接可以import过来

如下图所示:

Python显示进度条的方法

下面就是基本使用举例:

#!/usr/bin/env python
# -*- coding=utf-8 -*-
#Using GPL v2
#Author: ihipop@gmail.com
#2010-10-27 22:53
"""
Usage:
Just A Template
"""
from __future__ import division
 
import sys,time
from progressbar import *
total = 1000
 
#基本用法
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()
 
#高级用法
widgets = ['Progress: ', 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()

官方示例:http://code.google.com/p/python-progressbar/source/browse/progressbar/examples.py

#coding:utf-8
import sys
import time
from progressbar import AnimatedMarker, Bar, BouncingBar, Counter, ETA, \
  FileTransferSpeed, FormatLabel, Percentage, \
  ProgressBar, ReverseBar, RotatingMarker, \
  SimpleProgress, Timer

examples = []
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

@example
def example0():
  pbar = ProgressBar(widgets=[Percentage(), Bar()], maxval=300).start()
  for i in range(300):
    time.sleep(0.01)
    pbar.update(i+1)
  pbar.finish()

@example
def 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()

@example
def 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()

@example
def 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()

@example
def 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()

@example
def example5():
  pbar = ProgressBar(widgets=[SimpleProgress()], maxval=17).start()
  for i in range(17):
    time.sleep(0.2)
    pbar.update(i + 1)
  pbar.finish()

@example
def example6():
  pbar = ProgressBar().start()
  for i in range(100):
    time.sleep(0.01)
    pbar.update(i + 1)
  pbar.finish()

@example
def example7():
  pbar = ProgressBar() # Progressbar can guess maxval automatically.
  for i in pbar(range(80)):
    time.sleep(0.01)

@example
def example8():
  pbar = ProgressBar(maxval=80) # Progressbar can't guess maxval.
  for i in pbar((i for i in range(80))):
    time.sleep(0.01)

@example
def example9():
  pbar = ProgressBar(widgets=['Working: ', AnimatedMarker()])
  for i in pbar((i for i in range(50))):
    time.sleep(.08)

@example
def example10():
  widgets = ['Processed: ', Counter(), ' lines (', Timer(), ')']
  pbar = ProgressBar(widgets=widgets)
  for i in pbar((i for i in range(150))):
    time.sleep(0.1)

@example
def 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)

@example
def example12():
  widgets = ['Balloon: ', AnimatedMarker(markers='.oO@* ')]
  pbar = ProgressBar(widgets=widgets)
  for i in pbar((i for i in range(24))):
    time.sleep(0.3)

@example
def 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')

@example
def 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')

@example
def 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')

@example
def 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)

@example
def 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)

@example
def 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()

@example
def example19():
 pbar = ProgressBar()
 for i in pbar([]):
  pass
 pbar.finish()

try:
  for example in examples:
    example()
except KeyboardInterrupt:
  sys.stdout('\nQuitting examples.\n')

Progress Bar 使用例子

再发一个类:

#!/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
    return
  
if __name__ == "__main__":
  from time import sleep
  pb=progressbarClass(8,"*")
  count=0
  while count<9:
    count+=1
    pb.progress(count)
    sleep(0.2)

另外,python cookbook中11.1节也提供了一个不错的进度条类,代码如下:

import sys
class 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)

运行结果如下图所示:

Python显示进度条的方法 

希望本文所述对大家Python程序设计的学习有所帮助。

Python 相关文章推荐
python3访问sina首页中文的处理方法
Feb 24 Python
Python的Twisted框架中使用Deferred对象来管理回调函数
May 25 Python
Python数据结构之单链表详解
Sep 12 Python
使用python将图片格式转换为ico格式的示例
Oct 22 Python
python实现写数字文件名的递增保存文件方法
Oct 25 Python
python实现对指定字符串补足固定长度倍数截断输出的方法
Nov 15 Python
Django logging配置及使用详解
Jul 23 Python
用Python画一个LinkinPark的logo代码实例
Sep 10 Python
matplotlib教程——强大的python作图工具库
Oct 15 Python
Python用摘要算法生成token及检验token的示例代码
Dec 01 Python
python从ftp获取文件并下载到本地
Dec 05 Python
Python利用Turtle绘制哆啦A梦和小猪佩奇
Apr 04 Python
python中对list去重的多种方法
Sep 18 #Python
Python中用Descriptor实现类级属性(Property)详解
Sep 18 #Python
Python中的闭包总结
Sep 18 #Python
python的即时标记项目练习笔记
Sep 18 #Python
python脚本实现分析dns日志并对受访域名排行
Sep 18 #Python
python中的字典详细介绍
Sep 18 #Python
python中执行shell命令的几个方法小结
Sep 18 #Python
You might like
PHP 验证码不显示只有一个小红叉的解决方法
2013/09/30 PHP
PHP 只允许指定IP访问(允许*号通配符过滤IP)
2014/07/08 PHP
浅谈PHP定义命令空间的几个注意点(推荐)
2016/10/29 PHP
对laravel的session获取与存取方法详解
2019/10/08 PHP
使用JavaScript动态设置样式实现代码及演示动画
2013/01/25 Javascript
JS获取当前日期和时间的简单实例
2013/11/19 Javascript
在Javascript中处理字符串之big()方法的使用
2015/06/08 Javascript
学习javascript面向对象 掌握创建对象的9种方式
2016/01/04 Javascript
利用Angularjs和bootstrap实现购物车功能
2016/08/31 Javascript
JavaScript的new date等日期函数在safari中遇到的坑
2016/10/24 Javascript
深入理解AngularJS中的ng-bind-html指令
2017/03/27 Javascript
jquery 键盘事件的使用方法详解
2017/09/13 jQuery
element-ui中select组件绑定值改变,触发change事件方法
2018/08/24 Javascript
javascript网页随机点名实现过程解析
2019/10/15 Javascript
element实现合并单元格通用方法
2019/11/13 Javascript
vue+element实现动态加载表单
2020/12/13 Vue.js
详解Python3中的Sequence type的使用
2015/08/01 Python
Python算法应用实战之队列详解
2017/02/04 Python
python中如何使用正则表达式的非贪婪模式示例
2017/10/09 Python
深入理解Python分布式爬虫原理
2017/11/23 Python
批量将ppt转换为pdf的Python代码 只要27行!
2018/02/26 Python
Django使用Celery加redis执行异步任务的实例内容
2020/02/20 Python
Python基于smtplib模块发送邮件代码实例
2020/05/29 Python
利用CSS3参考手册和CSS3代码生成工具加速来学习网页制
2012/07/11 HTML / CSS
int和Integer有什么区别
2013/05/25 面试题
质量标语大全
2014/06/12 职场文书
拒绝黄毒毒宣传标语
2014/06/26 职场文书
高中生国庆节演讲稿范文2014
2014/09/21 职场文书
工程承包协议书
2014/10/20 职场文书
安全先进个人材料
2014/12/29 职场文书
公司开除员工通知
2015/04/22 职场文书
自我检讨书怎么写
2015/05/07 职场文书
关于分班的感言
2015/08/04 职场文书
职工的安全责任书范文!
2019/07/02 职场文书
python使用PySimpleGUI设置进度条及控件使用
2021/06/10 Python
彻底解决MySQL使用中文乱码的方法
2022/01/22 MySQL