tqdm实现进度条和下载速率显示

今天在研究urllib库的时候,urlretrieve实现文件的下载

from urllib import urlretrieve
urlretrieve(eg_link, filename=file, reporthook=t.update_to, data=None)

param:reporthook是个回调函数,传给回调函数的参数为:blocknum bs size

if reporthook:
    reporthook(blocknum, bs, size)
'''
block_num  : int, optional
到目前为止传输的块 [default: 1].
bs : int, optional
每个块的大小 (in tqdm units) [default: 1].
size : int, optional
文件总大小 (in tqdm units). 如果[default: None]保持不变.
'''

有了这三个参数,我们就可以计算出:文件的下载的进度了

progress = 100 * block_num * bs / size

但是我们这样看起来,是不是有点low

tqdm:Tqdm是 Python 进度条库,可以在 Python 长循环中添加一个进度提示信息用法:tqdm(iterator)

import time
from tqdm import trange

for i in trange(100):
    time.sleep(0.01)

怎么结合我们的urllib urlretrieve呢?

继承tqdm重写update_to方法

下面我们呈上代码:

#-*- coding:utf-8 -*-

import ssl
from urllib import urlretrieve
from tqdm import tqdm
import os

class TqdmUpTo(tqdm):
    # Provides `update_to(n)` which uses `tqdm.update(delta_n)`.

    last_block = 0
    def update_to(self, block_num=1, block_size=1, total_size=None):

        '''
        block_num  : int, optional
            到目前为止传输的块 [default: 1].
        block_size : int, optional
            每个块的大小 (in tqdm units) [default: 1].
        total_size : int, optional
            文件总大小 (in tqdm units). 如果[default: None]保持不变.
        '''
        if total_size is not None:
            self.total = total_size
        self.update((block_num - self.last_block) * block_size)
        self.last_block = block_num

ssl._create_default_https_context = ssl._create_unverified_context

eg_link = "https://dl.360safe.com/setup.exe"
file = eg_link.split('/')[-1]
with TqdmUpTo(unit='B', unit_scale=True, unit_divisor=1024, miniters=1,
              desc=file) as t:  # 继承至tqdm父类的初始化参数
    urlretrieve(eg_link, filename=file, reporthook=t.update_to, data=None)
print t.total
print os.path.getsize("setup.exe")

看看效果图:

 

你可能感兴趣的:(python)