Python requests流式下载文件 显示下载速度及百分比

# coding: utf-8
# -*- coding: utf-8 -*-
import time
import requests


def onefloat(num):
    return '{:.1f}'.format(num)


def run():
    # 请求下载地址,以流式的。打开要下载的文件位置。
    with requests.get('https://vault.centos.org/5.0/updates/SRPMS/autofs-5.0.1-0.rc2.43.0.2.src.rpm', stream=True) as r, open(r'G:\work\autofs-5.0.1-0.rc2.43.0.2.src.rpm', 'wb') as file:
        # 请求文件的大小单位字节B
        total_size = int(r.headers['content-length'])
        print(total_size)
        # 以下载的字节大小
        content_size = 0
        # 进度下载完成的百分比
        plan = 0
        # 请求开始的时间
        start_time = time.time()
        # 上秒的下载大小
        temp_size = 0
        # 开始下载每次请求1024字节
        for content in r.iter_content(chunk_size=1024):
            file.write(content)
            # 统计以下载大小
            content_size += len(content)
            # 计算下载进度
            plan = (content_size / total_size) * 100
            # 每一秒统计一次下载量
            if time.time() - start_time > 1:
                # 重置开始时间
                start_time = time.time()
                # 每秒的下载量
                speed = content_size - temp_size
                # KB级下载速度处理
                if 0 <= speed < (1024 ** 2):
                    print('\r', onefloat(plan), '%', onefloat(speed / 1024), 'KB/s', end='', flush=True)
                # MB级下载速度处理
                elif (1024 ** 2) <= speed < (1024 ** 3):
                    print('\r', onefloat(plan), '%', onefloat(speed / (1024 ** 2)), 'MB/s', end='', flush=True)
                # GB级下载速度处理
                elif (1024 ** 3) <= speed < (1024 ** 4):
                    print('\r', onefloat(plan), '%', onefloat(speed / (1024 ** 3)), 'GB/s', end='', flush=True)
                # TB级下载速度处理
                else:
                    print('\r', onefloat(plan), '%', onefloat(speed / (1024 ** 4)), 'TB/s', end='', flush=True)
                # 重置以下载大小
                temp_size = content_size


run()
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值