在写一个简单的FTP上传下载程序时,需要一个能显示下载进度的进度条,本想在网上找一个模块代替的,看的眼花缭乱,故此萌发了何不自己写一个就好了的想法!
说干就干,但是发现只是用print函数打印会不断的换行,这不算时一个进度条应有的style,在和度娘进行千百次交流后突然发现了可以用sys.stdout.write()来实现,
所以诞生了下面这个实现进度条的代码!
1 #!/usr/bin/env/python 2 # _*_ coding:utf-8 _*_ 3 # @Time : 2018/7/13 1:08 4 # @Author : Jingzeng Mo 5 # @Project: FTP_PROGRAM 6 7 import sys 8 import math 9 10 11 def progress_bar(portion, total): 12 """ 13 total 总数据大小,portion 已经传送的数据大小 14 :param portion: 已经接收的数据量 15 :param total: 总数据量 16 :return: 接收数据完成,返回True 17 """ 18 part = total / 50 # 1%数据的大小 19 count = math.ceil(portion / part) 20 sys.stdout.write('\r') 21 sys.stdout.write(('[%-50s]%.2f%%' % (('>' * count), portion / total * 100))) 22 sys.stdout.flush() 23 24 if portion >= total: 25 sys.stdout.write('\n') 26 return True 27 28 29 # 调用方式 30 portion = 0 31 total = 254820000 32 while True: 33 portion += 1024 34 sum = progress_bar(portion, total) 35 if sum: 36 break 37 print("ok")
进度条样式如下:
本程序调用了math()中的ceil()函数来实现向上取整,用与计算 “ > " 的个数,通过 sys.stdout.write("\r")实现了将指针重置到开头,最后程序结束时,打印一个 “ \n”,
实现换行的效果!
调用时,需要两个参数,一个是已经接收的数据量(portion)和 总的文件大小(total),通过累计传输的数据量和总数据量的比值实现了 显示百分比 的计算。
所以调用时需注意:
1. portion 是不断的累加的后的数据,而不是每次传输的数据量
2. 数据传输完毕后会返回一个值:True 并且换行
需要调用的朋友需要注意啦!
第一次发博客,若有什么好的建议,请不吝赐教!谢谢!!!