You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python文件下载过程中实时获取正确下载速率的技术问题

解决下载速率计算错误的问题

你的问题核心在于误用了纪元时间(time.time())计算速率——这个函数返回的是从1970年到当前的总秒数,用已下载大小除以这个天文数字,自然会得到极小的异常值。正确的思路应该是记录下载开始的时间点,每次计算进度时用当前时间减去开始时间,得到真实的下载耗时,再用已下载量除以耗时就能算出实时速率。

下面是基于你原有类结构修改后的代码,我保留了你的核心逻辑,只做了关键优化:

import time
import urllib.request

url = "http://xxxx.xxx.com/xxx/Setup.exe"
file_name = url[-9:]

class Download():
    def __init__(self):
        self.start_time = None  # 初始化开始时间变量
        urllib.request.urlretrieve(url, file_name, self.progress)
    
    def progress(self, block, blocksize, total):
        # 第一次回调时记录真正的下载开始时间(block从0开始计数)
        if self.start_time is None:
            self.start_time = time.time()
        
        total_size = total
        downloaded = block * blocksize
        left = total_size - downloaded
        percent = downloaded * 100 / total_size
        
        # 计算已消耗时间,避免刚启动时除以0的情况
        elapsed_time = time.time() - self.start_time
        rate_kb_s = (downloaded / 1024) / elapsed_time if elapsed_time > 0 else 0.0
        
        print("Total : \t\t", total_size)
        print("Downloaded : \t\t", downloaded)
        print("Left : \t\t", left)
        print("Percent : \t\t", round(percent, 2))  # 保留两位小数更易读
        print("Rate : \t\t", round(rate_kb_s, 2), "KB/s")  # 格式化输出速率

Download()

关键改动说明

  • 在类初始化时新增self.start_time变量,专门存储下载启动的时间戳
  • 在progress方法第一次被调用时(block=0)记录开始时间,确保时间统计从真正开始下载的时刻算起
  • 计算elapsed_time(已消耗的下载时间),用当前时间减去开始时间得到真实耗时
  • 增加了除以0的防护逻辑(下载刚启动时耗时为0,此时速率设为0)
  • 对百分比和速率做了四舍五入处理,让输出结果更直观

修改后你就能得到符合预期的实时下载速率,比如你提到的约1.5KB/s会正常显示出来。

内容的提问来源于stack exchange,提问作者PyCoder

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 07:47:06