Python实现控制台进度条功能


Posted in Python onJanuary 04, 2016

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

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

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

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

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

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

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

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

Python

#!/usr/bin/env python
# -*- coding=utf-8 -*-
#Using GPL v2
"""
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是退格键,也就是说把输出的光标往回退格子,这样就可以不用+=了,例如:

Python

#!/usr/bin/env python
# -*- coding=utf-8 -*-
#Using GPL v2
"""
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实现控制台进度条功能

下面就是基本使用举例:

Python

#!/usr/bin/env python
# -*- coding=utf-8 -*-
#Using GPL v2

"""
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

Python

# 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<a href="http://www.jobbole.com/members/weiboyes8848">@*</a> ')]
  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')

再发一个类:

Python

#!/usr/bin/env python
# -*- coding=utf-8 -*-
#Using GPL v2
"""
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节也提供了一个不错的进度条类,代码如下:

Python

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 相关文章推荐
PHP webshell检查工具 python实现代码
Sep 15 Python
Python实现设置windows桌面壁纸代码分享
Mar 28 Python
python开发之IDEL(Python GUI)的使用方法图文详解
Nov 12 Python
利用python批量检查网站的可用性
Sep 09 Python
Python使用wget实现下载网络文件功能示例
May 31 Python
浅谈python str.format与制表符\t关于中文对齐的细节问题
Jan 14 Python
Opencv-Python图像透视变换cv2.warpPerspective的示例
Apr 11 Python
详解python中自定义超时异常的几种方法
Jul 29 Python
python使用beautifulsoup4爬取酷狗音乐代码实例
Dec 04 Python
python垃圾回收机制(GC)原理解析
Dec 30 Python
Python爬取365好书中小说代码实例
Feb 28 Python
Python3+Appium安装及Appium模拟微信登录方法详解
Feb 16 Python
python实现网站的模拟登录
Jan 04 #Python
Python实现简单的文件传输与MySQL备份的脚本分享
Jan 03 #Python
简单介绍Python中的几种数据类型
Jan 02 #Python
简单实现python爬虫功能
Dec 31 #Python
python实现颜色空间转换程序(Tkinter)
Dec 31 #Python
基于python的Tkinter实现一个简易计算器
Dec 31 #Python
python实现爬虫统计学校BBS男女比例之数据处理(三)
Dec 31 #Python
You might like
php操作sqlserver关于时间日期读取的小小见解
2009/11/29 PHP
php实现ip白名单黑名单功能
2015/03/12 PHP
php实现将任意进制数转换成10进制的方法
2015/04/17 PHP
php将字符串转换为数组实例讲解
2020/05/05 PHP
javascript是怎么继承的介绍
2012/01/05 Javascript
input输入框的自动匹配(原生代码)
2013/03/19 Javascript
jquery分页对象使用示例
2014/04/01 Javascript
浅谈javascript中字符串String与数组Array
2014/12/31 Javascript
对JavaScript中this指针的新理解分享
2015/01/31 Javascript
JavaScript中操作字符串小结
2015/05/04 Javascript
jquery实现带缩略图的全屏图片画廊效果实例
2015/06/25 Javascript
js仿苹果iwatch外观的计时器代码分享
2015/08/26 Javascript
Javascript页面跳转常见实现方式汇总
2015/11/28 Javascript
详解JavaScript的内置对象
2016/12/07 Javascript
AngularJS通过ng-route实现基本的路由功能实例详解
2016/12/13 Javascript
用Vue-cli搭建的项目中引入css报错的原因分析
2017/07/20 Javascript
详解Vue文档中几个易忽视部分的剖析
2018/03/24 Javascript
js变量声明var使用与不使用的区别详解
2019/01/21 Javascript
JavaScript函数式编程(Functional Programming)高阶函数(Higher order functions)用法分析
2019/05/22 Javascript
使用Phantomjs和Node完成网页的截屏快照的方法
2019/07/16 Javascript
ES6中的类(Class)示例详解
2020/12/09 Javascript
Python实现一个Git日志统计分析的小工具
2017/12/14 Python
python模拟键盘输入 切换键盘布局过程解析
2019/08/15 Python
python 实现将小图片放到另一个较大的白色或黑色背景图片中
2019/12/12 Python
Pytorch基本变量类型FloatTensor与Variable用法
2020/01/08 Python
Flask模板引擎Jinja2使用实例
2020/04/23 Python
详解快速开发基于 HTML5 网络拓扑图应用
2018/01/08 HTML / CSS
中科软测试工程师面试题
2012/06/16 面试题
上课迟到检讨书
2014/02/19 职场文书
实习单位评语
2014/04/26 职场文书
2014年安全员工作总结
2014/11/13 职场文书
2014年幼儿园小班工作总结
2014/12/04 职场文书
参观邀请函范文
2015/02/02 职场文书
2016年小学“感恩教师”主题队日活动总结
2016/04/01 职场文书
2019个人半年工作总结
2019/06/21 职场文书
营销策划分析:怎么策划才能更好销量产品?
2019/09/04 职场文书