在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來進行刷新。
摘自:https://www.cnblogs.com/kellyseeme/p/5525020.html