Python實現(xiàn)控制臺中的進度條功能代碼
進度條最主要的問題就是所有字符全部在同一行,而且可以修改。
然而當執(zhí)行print語句的時候,python會在打印完這個語句的同時在結(jié)尾加上‘\n',也就是換行,這就導(dǎo)致在控制臺下一旦被print之后就無法再修改了。所以我們現(xiàn)在的輸出就不能再使用print來完成了。
我們要使用的是來自sys庫的sys.stdout.write()函數(shù),這個函數(shù)會在控制臺輸出這個字符串的同時不加上任何結(jié)尾,這就意味著這個輸出還沒有完全結(jié)束。通過sys.stdout.flush()函數(shù)可以把輸出暫時打印在控制臺中(造成print的假象,我們姑且先叫這個假輸出)。那么如果我們使用‘r'這個轉(zhuǎn)義字符(回到行首),一切看起來是不是就合理很多了呢?
也就是說:打印字符串的時候,沒有加上'\n',同時讓光標回到行首,再把當前緩沖區(qū)顯示出來,也就好象是print了一樣,但是這時候光標還在原來的位置。
一個例子
[經(jīng)測試,在Linux終端中執(zhí)行才有效果,pycharm中調(diào)試輸出沒有效果]
import sys, time for i in range(5): sys.stdout.write('HELLO: %05d' % i) sys.stdout.flush() time.sleep(1)
在終端下執(zhí)行這段代碼就會得到簡單的進度條效果。
接下來還需要解決兩個問題:
一:清空緩沖區(qū)
有些聰明的讀者可能發(fā)現(xiàn),當新的字符串比之前短的時候會出現(xiàn)問題,比如下面這段代碼:
import sys, time for i in range(5): sys.stdout.write(str(i) * (5 - i) + '\r') sys.stdout.flush() time.sleep(1)
運行后發(fā)現(xiàn)結(jié)果跟我們希望的不太一樣。
其實是因為已經(jīng)被flush出去的字符并不會主動清空,所以只有新寫入的被修改了。針對這點我目前的解決方案是先輸出一波空格把之前的字符串沖掉然后重新寫:
import sys, time for i in range(5): sys.stdout.write(' ' * 10 + '\r') sys.stdout.flush() sys.stdout.write(str(i) * (5 - i) + '\r') sys.stdout.flush() time.sleep(1)
二:固定底邊輸出
有時候我們希望在進度條加載的同時還有一些其他的輸出。
我們不妨在刷新掉上一次輸出之后輸出所需輸出的字符串,然后在假輸出進度條。
采用如下代碼:
import sys, time for i in range(5): sys.stdout.write(' ' * 10 + '\r') sys.stdout.flush() print i sys.stdout.write(str(i) * (5 - i) + '\r') sys.stdout.flush() time.sleep(1)
就可以完成所需任務(wù)了。
怎么樣,其實原理還是挺簡單的吧?
這里給出一個自己實現(xiàn)的類用來打印進度條:
import sys, time class ProgressBar: def __init__(self, count = 0, total = 0, width = 50): self.count = count self.total = total self.width = width def move(self): self.count += 1 def log(self, s): sys.stdout.write(' ' * (self.width + 9) + '\r') sys.stdout.flush() print s progress = self.width * self.count / self.total sys.stdout.write('{0:3}/{1:3}: '.format(self.count, self.total)) sys.stdout.write('#' * progress + '-' * (self.width - progress) + '\r') if progress == self.width: sys.stdout.write('\n') sys.stdout.flush() bar = ProgressBar(total = 10) for i in range(10): bar.move() bar.log('We have arrived at: ' + str(i + 1)) time.sleep(1)
效果如下:
這樣就可以方便的在一些任務(wù)中查看程序運行的進度了,比如爬蟲、機器學(xué)習(xí)等并不知道要花多少時間等工作也都可以有形象的時間把握了。
以上這篇Python實現(xiàn)控制臺中的進度條功能代碼就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
- Python使用progressbar模塊實現(xiàn)的顯示進度條功能
- 詳解Python中如何寫控制臺進度條的整理
- Python進度條實時顯示處理進度的示例代碼
- Python實現(xiàn)采用進度條實時顯示處理進度的方法
- 簡單實現(xiàn)python進度條腳本
- Python實現(xiàn)帶百分比的進度條
- Python在Console下顯示文本進度條的方法
- Python實現(xiàn)控制臺進度條功能
- python控制臺中實現(xiàn)進度條功能
- python在控制臺輸出進度條的方法
- Python調(diào)用命令行進度條的方法
- Python顯示進度條的方法
- 對python GUI實現(xiàn)完美進度條的示例詳解
相關(guān)文章
python給指定csv表格中的聯(lián)系人群發(fā)郵件(帶附件的郵件)
這篇文章主要介紹了python給指定csv表格中的聯(lián)系人群發(fā)郵件,本文通過代碼講解的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下2019-12-12Python 生成器,迭代,yield關(guān)鍵字,send()傳參給yield語句操作示例
這篇文章主要介紹了Python 生成器,迭代,yield關(guān)鍵字,send()傳參給yield語句操作,結(jié)合實例形式分析了Python生成器、迭代、yield關(guān)鍵字及異常處理相關(guān)操作技巧,需要的朋友可以參考下2019-10-10在Python的Django框架中更新數(shù)據(jù)庫數(shù)據(jù)的方法
這篇文章主要介紹了在Python的Django框架中更新數(shù)據(jù)庫數(shù)據(jù),對此Django框架中提供了便利的插入和更新方法,需要的朋友可以參考下2015-07-07pycharm 主題theme設(shè)置調(diào)整仿sublime的方法
今天小編就為大家分享一篇pycharm 主題theme設(shè)置調(diào)整仿sublime的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-05-05python中如何利用matplotlib畫多個并列的柱狀圖
python是一個很有趣的語言,可以在命令行窗口運行,下面這篇文章主要給大家介紹了關(guān)于python中如何利用matplotlib畫多個并列的柱狀圖的相關(guān)資料,需要的朋友可以參考下2022-01-01