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 相关文章推荐
python BeautifulSoup设置页面编码的方法
Apr 03 Python
python WindowsError的错误代码详解
Jul 23 Python
PyCharm代码格式调整方法
May 23 Python
python pandas修改列属性的方法详解
Jun 09 Python
python使用PIL给图片添加文字生成海报示例
Aug 17 Python
Python Multiprocessing多进程 使用tqdm显示进度条的实现
Aug 13 Python
Python搭建代理IP池实现接口设置与整体调度
Oct 27 Python
python3.x 生成3维随机数组实例
Nov 28 Python
Python3运算符常见用法分析
Feb 14 Python
python中通过pip安装库文件时出现“EnvironmentError: [WinError 5] 拒绝访问”的问题及解决方案
Aug 11 Python
Python Selenium操作Cookie的实例方法
Feb 28 Python
python如何将mat文件转为png
Jul 15 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
火车头采集器3.0采集图文教程
2007/03/17 PHP
PHP判断远程图片或文件是否存在的实现代码
2014/02/20 PHP
推荐25款php中非常有用的类库
2014/09/29 PHP
JQuery AJAX实现目录浏览与编辑的代码
2008/10/21 Javascript
JQuery-tableDnD 拖拽的基本使用介绍
2013/07/04 Javascript
jQuery使用$.ajax进行即时验证的方法
2015/12/08 Javascript
滚动条的监听与内容随着滚动条动态加载的实现
2017/02/08 Javascript
angular.JS实现网页禁用调试、复制和剪切
2017/03/31 Javascript
vue增删改查的简单操作
2017/07/15 Javascript
详解Vue中一种简易路由传参办法
2017/09/15 Javascript
原生JS封装animate运动框架的实例
2017/10/12 Javascript
Node.js实现发送邮件功能
2017/11/06 Javascript
Angular实现双向折叠列表组件的示例代码
2017/11/21 Javascript
关于 angularJS的一些用法
2017/11/29 Javascript
深入浅析var,let,const的异同点
2018/08/07 Javascript
vue 指令之气泡提示效果的实现代码
2018/10/18 Javascript
微信小程序swiper组件实现抖音翻页切换视频功能的实例代码
2020/06/24 Javascript
[02:30]DOTA2放量测试专访海涛:呼吁保护新手玩家
2013/08/26 DOTA
[02:08]DOTA2英雄基础教程 马格纳斯
2014/01/17 DOTA
[00:36]DOTA2勇士令状莱恩声望物品——冥晶之厄展示
2018/05/25 DOTA
在Python中处理字符串之isdigit()方法的使用
2015/05/18 Python
浅谈编码,解码,乱码的问题
2016/12/30 Python
Python的时间模块datetime详解
2017/04/17 Python
python ctypes库2_指定参数类型和返回类型详解
2019/11/19 Python
PyTorch学习:动态图和静态图的例子
2020/01/06 Python
Python学习之os模块及用法
2020/06/03 Python
Lands’ End英国官方网站:高质量男女服装
2017/10/07 全球购物
ALDO英国官网:加拿大女鞋品牌
2018/02/19 全球购物
什么是唯一索引
2015/07/05 面试题
大学生水文观测实习自我鉴定
2013/09/29 职场文书
2014年学生党支部工作总结
2014/12/20 职场文书
优秀团支部申报材料
2014/12/26 职场文书
党风廉政建设调研报告
2015/01/01 职场文书
世界水日宣传活动总结
2015/02/09 职场文书
财务会计求职信范文
2015/03/20 职场文书
SQL Server Agent 服务无法启动
2022/04/20 SQL Server