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

來源:互聯網
上載者:User
我們大多數人都希望寫一些簡單的python指令碼的同時都想能夠在程式啟動並執行過程中實現進度條的功能以便查看程式啟動並執行速度或者進度。今天就和大家探討這個問題:如何在python控制台中實現進度條功

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

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

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

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

舉個例子:

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

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

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

一:清空緩衝區

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

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

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

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

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)

二:固定底邊輸出

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

我們不妨在重新整理掉上一次輸出之後輸出所需輸出的字串,然後在假輸出進度條。

採用如下代碼:

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)

就可以完成所需任務了。

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

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

# -*- 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)

效果如下:

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

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

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.