Python显示进度条的方法
本文实例讲述了Python显示进度条的方法,是Python程序设计中非常实用的技巧。分享给大家供大家参考。具体方法如下:
首先,进度条和一般的print区别在哪里呢?
答案就是print会输出一个\n,也就是换行符,这样光标移动到了下一行行首,接着输出,之前已经通过stdout输出的东西依旧保留,而且保证我们在下面看到最新的输出结果。
进度条不然,我们必须再原地输出才能保证他是一个进度条,否则换行了怎么还叫进度条?
最简单的办法就是,再输出完毕后,把光标移动到行首,继续在那里输出更长的进度条即可实现,新的更长的进度条把旧的短覆盖,就形成了动画效果。
可以想到那个转义符了吧,那就是\r。
转义符\r就可以把光标移动到行首而不换行,转义符\n就把光标移动到行首并且换行。
在python中,输出stdout(标准输出)可以使用sys.stdout.write
例如:
#!/usr/bin/envpython #-*-coding=utf-8-*- #UsingGPLv2 #Author:ihipop@gmail.com ##2010-10-2722:07 """ Usage: JustATemplate """ from__future__importdivision importsys,time j="#" if__name__=="__main__": foriinrange(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/envpython #-*-coding=utf-8-*- #UsingGPLv2 #Author:ihipop@gmail.com #2010-10-2722:07 """ Usage: JustATemplate """ from__future__importdivision importsys,time if__name__=="__main__": foriinrange(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/envpython #-*-coding=utf-8-*- #UsingGPLv2 #Author:ihipop@gmail.com #2010-10-2722:53 """ Usage: JustATemplate """ from__future__importdivision importsys,time fromprogressbarimport* total=1000 #基本用法 progress=ProgressBar() foriinprogress(range(total)): time.sleep(0.01) pbar=ProgressBar().start() foriinrange(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() foriinrange(1000000): #dosomething 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 importsys importtime fromprogressbarimportAnimatedMarker,Bar,BouncingBar,Counter,ETA,\ FileTransferSpeed,FormatLabel,Percentage,\ ProgressBar,ReverseBar,RotatingMarker,\ SimpleProgress,Timer examples=[] defexample(fn): try:name="Example%d"%int(fn.__name__[7:]) except:name=fn.__name__ defwrapped(): try: sys.stdout.write("Running:%s\n"%name) fn() sys.stdout.write("\n") exceptKeyboardInterrupt: sys.stdout.write("\nSkippingexample.\n\n") examples.append(wrapped) returnwrapped @example defexample0(): pbar=ProgressBar(widgets=[Percentage(),Bar()],maxval=300).start() foriinrange(300): time.sleep(0.01) pbar.update(i+1) pbar.finish() @example defexample1(): widgets=["Test:",Percentage(),"",Bar(marker=RotatingMarker()), "",ETA(),"",FileTransferSpeed()] pbar=ProgressBar(widgets=widgets,maxval=10000000).start() foriinrange(1000000): #dosomething pbar.update(10*i+1) pbar.finish() @example defexample2(): classCrazyFileTransferSpeed(FileTransferSpeed): """It"sbiggerbetween45and80percent.""" defupdate(self,pbar): if45<pbar.percentage()<80: return"BiggerNow"+FileTransferSpeed.update(self,pbar) else: returnFileTransferSpeed.update(self,pbar) widgets=[CrazyFileTransferSpeed(),"<<<",Bar(),">>>", Percentage(),"",ETA()] pbar=ProgressBar(widgets=widgets,maxval=10000000) #maybedosomething pbar.start() foriinrange(2000000): #dosomething pbar.update(5*i+1) pbar.finish() @example defexample3(): widgets=[Bar(">"),"",ETA(),"",ReverseBar("<")] pbar=ProgressBar(widgets=widgets,maxval=10000000).start() foriinrange(1000000): #dosomething pbar.update(10*i+1) pbar.finish() @example defexample4(): widgets=["Test:",Percentage(),"", Bar(marker="0",left="[",right="]"), "",ETA(),"",FileTransferSpeed()] pbar=ProgressBar(widgets=widgets,maxval=500) pbar.start() foriinrange(100,500+1,50): time.sleep(0.2) pbar.update(i) pbar.finish() @example defexample5(): pbar=ProgressBar(widgets=[SimpleProgress()],maxval=17).start() foriinrange(17): time.sleep(0.2) pbar.update(i+1) pbar.finish() @example defexample6(): pbar=ProgressBar().start() foriinrange(100): time.sleep(0.01) pbar.update(i+1) pbar.finish() @example defexample7(): pbar=ProgressBar()#Progressbarcanguessmaxvalautomatically. foriinpbar(range(80)): time.sleep(0.01) @example defexample8(): pbar=ProgressBar(maxval=80)#Progressbarcan"tguessmaxval. foriinpbar((iforiinrange(80))): time.sleep(0.01) @example defexample9(): pbar=ProgressBar(widgets=["Working:",AnimatedMarker()]) foriinpbar((iforiinrange(50))): time.sleep(.08) @example defexample10(): widgets=["Processed:",Counter(),"lines(",Timer(),")"] pbar=ProgressBar(widgets=widgets) foriinpbar((iforiinrange(150))): time.sleep(0.1) @example defexample11(): widgets=[FormatLabel("Processed:%(value)dlines(in:%(elapsed)s)")] pbar=ProgressBar(widgets=widgets) foriinpbar((iforiinrange(150))): time.sleep(0.1) @example defexample12(): widgets=["Balloon:",AnimatedMarker(markers=".oO@*")] pbar=ProgressBar(widgets=widgets) foriinpbar((iforiinrange(24))): time.sleep(0.3) @example defexample13(): #Youmayneedpython3.xtoseethiscorrectly try: widgets=["Arrows:",AnimatedMarker(markers="←?↑?→?↓?")] pbar=ProgressBar(widgets=widgets) foriinpbar((iforiinrange(24))): time.sleep(0.3) exceptUnicodeError:sys.stdout.write("Unicodeerror:skippingexample") @example defexample14(): #Youmayneedpython3.xtoseethiscorrectly try: widgets=["Arrows:",AnimatedMarker(markers="????")] pbar=ProgressBar(widgets=widgets) foriinpbar((iforiinrange(24))): time.sleep(0.3) exceptUnicodeError:sys.stdout.write("Unicodeerror:skippingexample") @example defexample15(): #Youmayneedpython3.xtoseethiscorrectly try: widgets=["Wheels:",AnimatedMarker(markers="◐◓◑◒")] pbar=ProgressBar(widgets=widgets) foriinpbar((iforiinrange(24))): time.sleep(0.3) exceptUnicodeError:sys.stdout.write("Unicodeerror:skippingexample") @example defexample16(): widgets=[FormatLabel("Bouncer:value%(value)d-"),BouncingBar()] pbar=ProgressBar(widgets=widgets) foriinpbar((iforiinrange(180))): time.sleep(0.05) @example defexample17(): widgets=[FormatLabel("AnimatedBouncer:value%(value)d-"), BouncingBar(marker=RotatingMarker())] pbar=ProgressBar(widgets=widgets) foriinpbar((iforiinrange(180))): time.sleep(0.05) @example defexample18(): widgets=[Percentage(), "",Bar(), "",ETA(), "",AdaptiveETA()] pbar=ProgressBar(widgets=widgets,maxval=500) pbar.start() foriinrange(500): time.sleep(0.01+(i<100)*0.01+(i>400)*0.9) pbar.update(i+1) pbar.finish() @example defexample19(): pbar=ProgressBar() foriinpbar([]): pass pbar.finish() try: forexampleinexamples: example() exceptKeyboardInterrupt: sys.stdout("\nQuittingexamples.\n") ProgressBar使用例子
再发一个类:
#!/usr/bin/envpython #-*-coding=utf-8-*- #UsingGPLv2 #Author:ihipop@gmail.com #2010-10-3013:59 """ Usage: JustATemplate """ classprogressbarClass: def__init__(self,finalcount,progresschar=None): importsys self.finalcount=finalcount self.blockcount=0 # #Seeifcallerpassedmeacharactertouseonthe #progressbar(like"*").Ifnotusetheblock #characterthatmakesitlooklikearealprogress #bar. # ifnotprogresschar:self.block=chr(178) else:self.block=progresschar # #Getpointertosys.stdoutsoIcanusethewrite/flush #methodstodisplaytheprogressbar. # self.f=sys.stdout # #Ifthefinalcountiszero,don"tstarttheprogressgauge # ifnotself.finalcount:return self.f.write("\n-------------------%Progress-------------------\n") return defprogress(self,count): # #MakesureIdon"ttrytogoofftheend(e.g.>100%) # count=min(count,self.finalcount) # #Iffinalcountiszero,I"mdone # ifself.finalcount: percentcomplete=int(round(100*count/self.finalcount)) ifpercentcomplete<1:percentcomplete=1 else: percentcomplete=100 #print"percentcomplete=",percentcomplete blockcount=int(percentcomplete/2) #print"blockcount=",blockcount ifblockcount>self.blockcount: foriinrange(self.blockcount,blockcount): self.f.write(self.block) self.f.flush() ifpercentcomplete==100:self.f.write("\n") self.blockcount=blockcount return if__name__=="__main__": fromtimeimportsleep pb=progressbarClass(8,"*") count=0 whilecount<9: count+=1 pb.progress(count) sleep(0.2)
另外,pythoncookbook中11.1节也提供了一个不错的进度条类,代码如下:
importsys classprogressbar(object): def__init__(self,finalcount,block_char="."): self.finalcount=finalcount self.blockcount=0 self.block=block_char self.f=sys.stdout ifnotself.finalcount:return self.f.write("\n------------------%Progress-------------------1\n") self.f.write("1234567890\n") self.f.write("----0----0----0----0----0----0----0----0----0----0\n") defprogress(self,count): count=min(count,self.finalcount) ifself.finalcount: percentcomplete=int(round(100.0*count/self.finalcount)) ifpercentcomplete<1:percentcomplete=1 else: percentcomplete=100 blockcount=int(percentcomplete//2) ifblockcount<=self.blockcount: return foriinrange(self.blockcount,blockcount): self.f.write(self.block) self.f.flush() self.blockcount=blockcount ifpercentcomplete==100: self.f.write("\n") if__name__=="__main__": fromtimeimportsleep pb=progressbar(8,"*") forcountinrange(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"testing1:" pb=progressbar(1) pb.progress(1)
运行结果如下图所示:
希望本文所述对大家Python程序设计的学习有所帮助。
相关文章
- python求逆矩阵的方法,Python 如何求矩阵的逆「建议收藏」
- python判断linux中文件是否存在_Python判断文件是否存在的三种方法
- python入门基础(14)
- 【说站】python ElementTree解析的方法
- 【说站】python析构函数的底层机制
- 【说站】python用circle函数画兔子的方法
- UE5 中用 Python 接口创建 Level Sequence 与设置 TriggerEvent
- python图像多层小波分解_Python中图像小波分解与重构以及灰度图加噪
- python中copy.deepcopy_Python eval
- pycharm如何调试python程序_Pycharm断点调试Python程序的步骤方法
- python requests post 使用 multipart/form-data 上传文件方法
- Python jiba 分词详解程序员
- python不是内部或外部命令的解决方法
- Python center()字符串居中对齐方法详解
- Python列表推导式的使用方法
- python字典(dict)遍历的四种方法性能测试报告
- Python转换HTML到Text纯文本的方法
- Python判断变量是否已经定义的方法
- Python中实现字符串类型与字典类型相互转换的方法