一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

腳本之家,腳本語言編程技術及教程分享平臺!
分類導航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務器之家 - 腳本之家 - Python - Python實現控制臺中的進度條功能代碼

Python實現控制臺中的進度條功能代碼

2020-12-28 00:14_icrazy_ Python

下面小編就為大家分享一篇Python實現控制臺中的進度條功能代碼,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧

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

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

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

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

一個例子

[經測試,在Linux終端中執行才有效果,pycharm中調試輸出沒有效果]

?
1
2
3
4
5
import sys, time
for i in range(5):
 sys.stdout.write('HELLO: %05d' % i)
 sys.stdout.flush()
 time.sleep(1)

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

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

一:清空緩沖區

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

?
1
2
3
4
5
import sys, time
for i in range(5):
 sys.stdout.write(str(i) * (5 - i) + '\r')
 sys.stdout.flush()
 time.sleep(1)

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

其實是因為已經被flush出去的字符并不會主動清空,所以只有新寫入的被修改了。針對這點我目前的解決方案是先輸出一波空格把之前的字符串沖掉然后重新寫:

?
1
2
3
4
5
6
7
8
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)

二:固定底邊輸出

有時候我們希望在進度條加載的同時還有一些其他的輸出。

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

采用如下代碼:

?
1
2
3
4
5
6
7
8
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)

就可以完成所需任務了。

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

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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實現控制臺中的進度條功能代碼

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

以上這篇Python實現控制臺中的進度條功能代碼就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持服務器之家。

原文鏈接:http://blog.csdn.net/u010472607/article/details/78807033

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 动漫美女胸被狂揉扒开吃奶动态图 | 欧美男女爱爱视频 | 欧美一区二区三区综合色视频 | 亚洲国产精品久久精品成人网站 | 日本人成动漫网站在线观看 | 日韩一区二区三区精品 | 日本动漫啪啪动画片mv | 国产午夜精品福利 | 欧美裸妇| chinesexxxx高中生gay | 日产精品卡一卡2卡三卡乱码工厂 | 男人视频网 | 久久天天躁狠狠躁夜夜躁 | 污污免费 | 成人蜜桃网 | 精品国产区一区二区三区在线观看 | 欧美日韩高清一区 | 二区三区视频 | 久久精品麻豆国产天美传媒果冻 | 特级夫妻大片免费在线播放 | 色天天综合网色鬼综合 | 美女扒开腿让男人桶爽动态图片 | 亚洲爱视频 | 国产精品久久久久久久福利院 | 2021福利视频 | 日韩一级片免费观看 | 欧美a一片xxxx片与善交 | 日韩欧美亚洲一区二区综合 | 亚洲午夜久久久久影院 | 丝瓜秋葵番茄绿巨人在线观看 | 色中文 | 视频在线观看一区二区三区 | 亚洲老头与老太hd | 国产亚洲精品自在线亚洲情侣 | 人与动人物aaaa | 欧美性白人顶级hd | 日韩高清在线高清免费 | yellow片在线观看 | 齐天大性之七仙女欲春迅雷链接 | 国产精品网页 | 女攻双性|