欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

python控制臺中實現進度條功能

系統 2027 0

我們大多數人都希望寫一些簡單的python腳本的同時都想能夠在程序運行的過程中實現進度條的功能以便查看程序運行的速度或者進度。今天就和大家探討這個問題:如何在python控制臺中實現進度條功

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

然而當執行print語句的時候,python會在打印完這個語句的同時在結尾加上'\n',也就是換行,這就導致在控制臺下一旦被print之后就無法再修改了。所以我們現在的輸出就不能再使用print來完成了。

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

也就是說:打印字符串的時候,沒有加上'\n',同時讓光標回到行首,再把當前緩沖區顯示出來,也就好象是print了一樣,但是這時候光標還在原來的位置。

舉個例子:

            
import sys, time

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


          

在終端下執行這段代碼就會得到簡單的進度條效果。

接下來還需要解決兩個問題:

一:清空緩沖區

有些聰明的讀者可能發現,當新的字符串比之前短的時候會出現問題,比如下面這段代碼:

            
import sys, time

for i in range(5):
 sys.stdout.write(str(i) * (5 - i) + '\r')
 sys.stdout.flush()
 time.sleep(1)


          

運行后發現結果跟我們希望的不太一樣。

其實是因為已經被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)


          

就可以完成所需任務了。

怎么樣,其實原理還是挺簡單的吧?

這里給出一個自己實現的類用來打印進度條:

            
# -*- coding:utf-8 -*-

# Copyright: Lustralisk
# Author: Cedric Liu
# Date: 2015-11-08

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)


          

效果如下:

python控制臺中實現進度條功能_第1張圖片

這樣就可以方便的在一些任務中查看程序運行的進度了,比如爬蟲、機器學習等并不知道要花多少時間等工作也都可以有形象的時間把握了。

以上就是在python控制臺中實現進度條功能的方法,并給出了自己實現的類用來打印進度條,希望對大家的學習有所幫助。


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 国产成人91高清精品免费 | 亚洲综合精品成人 | 激情六月综合 | 欧美精品一区二区在线观看 | 国产亚洲精品久久久久久久久动漫 | 天堂网中文字幕 | 天天干天天操天天爽 | 乳欲人妻办公室奶水在线电影国产 | 久久精品国产999大香线焦 | 成人毛片视频在线播放 | 59pao成国产成视频永久免费 | 中文字幕av亚洲精品一部二部 | 亚洲一级电影 | 国产乱码一区二区三区 | 成人亚洲精品 | 欧美二区三区 | 久草在线免费新视频 | 亚洲一区二区三区免费观看 | 欧美精品国产综合久久 | 99在线精品免费视频九九视 | 日韩欧美精品在线 | 春色www视频在线观看 | 成人a视频在线观看 | 在线不卡一区 | 亚洲第一精品在线 | 中文字幕一区二区三区乱码图片 | 天天看逼 | 亚洲欧美一区二区三区综合 | 国产亚洲美女精品久久久久 | 在线视频 中文字幕 | 另类在线视频 | 国产精品一区二区免费 | xxnxx中国18| 国产精品拍自在线观看 | 日本成人在线网站 | 日本黄色不卡视频 | 国产视频99 | 国产欧美日韩亚洲精品区2345 | 免费视频片在线观看大片 | 美女福利视频国产免费观看 | a级毛片高清免费视频 |