詳解Python中如何寫控制臺(tái)進(jìn)度條的整理
本文實(shí)例講述了Python顯示進(jìn)度條的方法,是Python程序設(shè)計(jì)中非常實(shí)用的技巧。分享給大家供大家參考。具體方法如下:
首先,進(jìn)度條和一般的print區(qū)別在哪里呢?
答案就是print會(huì)輸出一個(gè)\n,也就是換行符,這樣光標(biāo)移動(dòng)到了下一行行首,接著輸出,之前已經(jīng)通過stdout輸出的東西依舊保留,而且保證我們?cè)谙旅婵吹阶钚碌妮敵鼋Y(jié)果。
進(jìn)度條不然,我們必須再原地輸出才能保證他是一個(gè)進(jìn)度條,否則換行了怎么還叫進(jìn)度條?
最簡(jiǎn)單的辦法就是,再輸出完畢后,把光標(biāo)移動(dòng)到行首,繼續(xù)在那里輸出更長(zhǎng)的進(jìn)度條即可實(shí)現(xiàn),新的更長(zhǎng)的進(jìn)度條把舊的短覆蓋,就形成了動(dòng)畫效果。
可以想到那個(gè)轉(zhuǎn)義符了吧,那就是\ r。
轉(zhuǎn)義符r就可以把光標(biāo)移動(dòng)到行首而不換行,轉(zhuǎn)義符n就把光標(biāo)移動(dòng)到行首并且換行。
在python中,輸出stdout(標(biāo)準(zhǔn)輸出)可以使用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
第二種思路是用轉(zhuǎn)義符\b
轉(zhuǎn)義符\b是退格鍵,也就是說把輸出的光標(biāo)往回退格子,這樣就可以不用+=了,例如:
#!/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
光標(biāo)回退2格,寫個(gè)#再回退,再寫,達(dá)到增長(zhǎng)的目的了
不過寫這么多似乎是廢話,在耳邊常常聽到一句話:那就是不要重復(fù)造輪子。實(shí)際上python有豐富發(fā)lib幫你實(shí)現(xiàn)這個(gè)東西,你完全可以把心思放在邏輯開發(fā)上而不用注意這些小細(xì)節(jié)
下面要介紹的就是這個(gè)類“progressbar”,使用easy_install可以方便的安裝這個(gè)類庫(kù),其實(shí)就一個(gè)文件,拿過來放到文件同一個(gè)目錄下面也直接可以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() #高級(jí)用法 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<a rel="external nofollow" >@*</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')
再發(fā)一個(gè)類:
#!/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節(jié)也提供了一個(gè)不錯(cuò)的進(jìn)度條類,代碼如下:
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)
運(yùn)行結(jié)果如下圖所示:
希望本文所述對(duì)大家Python程序設(shè)計(jì)的學(xué)習(xí)有所幫助。也希望大家多多支持腳本之家。
- Python使用progressbar模塊實(shí)現(xiàn)的顯示進(jìn)度條功能
- Python進(jìn)度條實(shí)時(shí)顯示處理進(jìn)度的示例代碼
- Python實(shí)現(xiàn)控制臺(tái)中的進(jìn)度條功能代碼
- Python實(shí)現(xiàn)采用進(jìn)度條實(shí)時(shí)顯示處理進(jìn)度的方法
- 簡(jiǎn)單實(shí)現(xiàn)python進(jìn)度條腳本
- Python實(shí)現(xiàn)帶百分比的進(jìn)度條
- Python在Console下顯示文本進(jìn)度條的方法
- Python實(shí)現(xiàn)控制臺(tái)進(jìn)度條功能
- python控制臺(tái)中實(shí)現(xiàn)進(jìn)度條功能
- python在控制臺(tái)輸出進(jìn)度條的方法
- Python調(diào)用命令行進(jìn)度條的方法
- Python顯示進(jìn)度條的方法
- 對(duì)python GUI實(shí)現(xiàn)完美進(jìn)度條的示例詳解
相關(guān)文章
python類別數(shù)據(jù)數(shù)字化LabelEncoder?VS?OneHotEncoder區(qū)別
這篇文章主要為大家介紹了機(jī)器學(xué)習(xí):數(shù)據(jù)預(yù)處理之將類別數(shù)據(jù)數(shù)字化的方法LabelEncoder?VS?OneHotEncoder區(qū)別詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09jupyter notebook更換皮膚主題的實(shí)現(xiàn)
這篇文章主要介紹了jupyter notebook更換皮膚主題的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01解決Pytorch dataloader時(shí)報(bào)錯(cuò)每個(gè)tensor維度不一樣的問題
這篇文章主要介紹了解決Pytorch dataloader時(shí)報(bào)錯(cuò)每個(gè)tensor維度不一樣的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-05-05python筆記(1) 關(guān)于我們應(yīng)不應(yīng)該繼續(xù)學(xué)習(xí)python
關(guān)于Python,如果你要學(xué)習(xí),建議大家查看一下網(wǎng)站:因?yàn)楸救艘彩莿倓倹Q定收集點(diǎn)零碎時(shí)間來學(xué)習(xí)下它,推薦可能并不是最好的2012-10-10Python正則表達(dá)式re.search()用法詳解
re是Python中最常見的正則表達(dá)式模塊,常用方法包括compile,match,findall,finditer,search,split,sub等,下面這篇文章主要給大家介紹了關(guān)于Python正則表達(dá)式re.search()用法詳解的相關(guān)資料,需要的朋友可以參考下2022-09-09