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
相关产品推荐
相关产品推荐

