今天在研究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")
看看效果图: