国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > Python > 正文

python控制臺(tái)中實(shí)現(xiàn)進(jìn)度條功能

2019-11-25 17:02:45
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

我們大多數(shù)人都希望寫(xiě)一些簡(jiǎn)單的python腳本的同時(shí)都想能夠在程序運(yùn)行的過(guò)程中實(shí)現(xiàn)進(jìn)度條的功能以便查看程序運(yùn)行的速度或者進(jìn)度。今天就和大家探討這個(gè)問(wèn)題:如何在python控制臺(tái)中實(shí)現(xiàn)進(jìn)度條功

進(jìn)度條最主要的問(wèn)題就是所有字符全部在同一行,而且可以修改。

然而當(dāng)執(zhí)行print語(yǔ)句的時(shí)候,python會(huì)在打印完這個(gè)語(yǔ)句的同時(shí)在結(jié)尾加上'/n',也就是換行,這就導(dǎo)致在控制臺(tái)下一旦被print之后就無(wú)法再修改了。所以我們現(xiàn)在的輸出就不能再使用print來(lái)完成了。

我們要使用的是來(lái)自sys庫(kù)的sys.stdout.write()函數(shù),這個(gè)函數(shù)會(huì)在控制臺(tái)輸出這個(gè)字符串的同時(shí)不加上任何結(jié)尾,這就意味著這個(gè)輸出還沒(méi)有完全結(jié)束。通過(guò)sys.stdout.flush()函數(shù)可以把輸出暫時(shí)打印在控制臺(tái)中(造成print的假象,我們姑且先叫這個(gè)假輸出)。那么如果我們使用'/r'這個(gè)轉(zhuǎn)義字符(回到行首),一切看起來(lái)是不是就合理很多了呢?

也就是說(shuō):打印字符串的時(shí)候,沒(méi)有加上'/n',同時(shí)讓光標(biāo)回到行首,再把當(dāng)前緩沖區(qū)顯示出來(lái),也就好象是print了一樣,但是這時(shí)候光標(biāo)還在原來(lái)的位置。

舉個(gè)例子:

import sys, timefor i in range(5): sys.stdout.write('{0}/5/r'.format(i + 1)) sys.stdout.flush() time.sleep(1)

在終端下執(zhí)行這段代碼就會(huì)得到簡(jiǎn)單的進(jìn)度條效果。

接下來(lái)還需要解決兩個(gè)問(wèn)題:

一:清空緩沖區(qū)

有些聰明的讀者可能發(fā)現(xiàn),當(dāng)新的字符串比之前短的時(shí)候會(huì)出現(xiàn)問(wèn)題,比如下面這段代碼:

import sys, timefor i in range(5): sys.stdout.write(str(i) * (5 - i) + '/r') sys.stdout.flush() time.sleep(1)

運(yùn)行后發(fā)現(xiàn)結(jié)果跟我們希望的不太一樣。

其實(shí)是因?yàn)橐呀?jīng)被flush出去的字符并不會(huì)主動(dòng)清空,所以只有新寫(xiě)入的被修改了。針對(duì)這點(diǎn)我目前的解決方案是先輸出一波空格把之前的字符串沖掉然后重新寫(xiě):

import sys, timefor 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)

二:固定底邊輸出

有時(shí)候我們希望在進(jìn)度條加載的同時(shí)還有一些其他的輸出。

我們不妨在刷新掉上一次輸出之后輸出所需輸出的字符串,然后在假輸出進(jìn)度條。

采用如下代碼:

import sys, timefor 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ù)了。

怎么樣,其實(shí)原理還是挺簡(jiǎn)單的吧?

這里給出一個(gè)自己實(shí)現(xiàn)的類(lèi)用來(lái)打印進(jìn)度條:

# -*- coding:utf-8 -*-# Copyright: Lustralisk# Author: Cedric Liu# Date: 2015-11-08import sys, timeclass 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ù)中查看程序運(yùn)行的進(jìn)度了,比如爬蟲(chóng)、機(jī)器學(xué)習(xí)等并不知道要花多少時(shí)間等工作也都可以有形象的時(shí)間把握了。

以上就是在python控制臺(tái)中實(shí)現(xiàn)進(jìn)度條功能的方法,并給出了自己實(shí)現(xiàn)的類(lèi)用來(lái)打印進(jìn)度條,希望對(duì)大家的學(xué)習(xí)有所幫助。

發(fā)表評(píng)論 共有條評(píng)論
用戶(hù)名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 莱芜市| 沙湾县| 高要市| 九台市| 象山县| 兴业县| 台北县| 南京市| 龙岩市| 和静县| 平阳县| 密山市| 怀宁县| 平阴县| 莱阳市| 鱼台县| 阳春市| 三亚市| 淳安县| 冀州市| 伊宁市| 保靖县| 盐城市| 瓦房店市| 阿拉尔市| 南昌县| 康保县| 湘乡市| 两当县| 双辽市| 汶上县| 商水县| 基隆市| 循化| 商南县| 福海县| 长泰县| 子洲县| 客服| 湖州市| 石首市|