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过来


下面就是基本使用举例:


#!/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


再发一个类:


#!/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)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值