python實現進度條--主要用在上傳下載文件


在python中進行socket上傳文件的時候使用進度條,然后在網上找了好久,找尋相關的進度的條的使用,看了幾個,發現總是無法進行調用,主要原因是在進行上傳文件的時候,每次傳送的數據量是固定的,數據的總大小也是知道的,對於那么多的進度條的使用調用方法感覺總是不合適,今天終於發現了如何調用比較好。


進度條的代碼如下:

#!/usr/bin/env python

from __future__ import division
import math
import sys
def progressbar(cur,total):
    percent = '{:.2%}'.format(cur / total)
    sys.stdout.write('\r')
    sys.stdout.write('[%-50s] %s' % ( '=' * int(math.floor(cur * 50 /total)),percent))
    sys.stdout.flush()
    if cur == total:
        sys.stdout.write('\n')

if __name__ == '__main__':
    file_size = 102400000
    size = 1024
    while file_size > 0:
        progressbar(size*10/file_size,10)
        file_size -= 1024

    #for i in range(11):
    #    progressbar(i,10)
    #    time.sleep(1)

在進行計算百分比的時候,需要用到除法,而基本上都是整數,從而使用到dicision。

在函數progressbar中,cur表示當前的數值,total表示總的數值。

在輸出進度的時候,每次都是輸出一行,但是每次輸出的時候不換行,從而使用\r,每次回到行首,但是不進行換行,然后輸出其他的內容對原內容進行覆蓋,也就是sys.stdout.write的第二句話。

flush是為了立即進行顯示,也就是將進度條直接顯示。

在最后,如果當前的等於總的,那么久輸出一個回車進行換行,表示輸出進度結束。


在測試代碼中,file_size表示為文件的大小,size表示每次都要傳送的數據量,在循環中,表示每次需要傳送1024個字節,然后輸出進度條,運行效果如下:

[root@python 519]# python processbar.py
[==================================================] 100.00%

主要就是在開始的時候,覺得需要知道傳輸文件的速度,才能估算傳輸的進度,但是使用文件的大小也是可以估算的,從而也就有了size*10/1024,將長度固定為10個,從而輸出進度。


在看第二句輸出的時候覆蓋的時候,可以使用如下的代碼:

#!/usr/bin/env python

import sys

sys.stdout.write('[%-10s]' % ('='*3))
sys.stdout.flush()

運行之后會發現進行了替代。其中減號表示向左對齊,10表示使用十個占位符,后面的替換中,表示使用等號替換前三個空格,在每次數量增加后,從而每次替換的數量增多,從而達到運行時候的覆蓋效果,從而看起來是動態的進度條。


注意,在python的解釋器中直接運行的時候,會輸出和在py文件中不一樣,是因為在解釋器中直接執行了,在py文件中,需要時使用flush來進行刷新。




免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM