如何使用Python基于Google Drive API实现下载速度实时展示
Python调用Google Drive API显示实时下载速度的修改方案
核心实现逻辑:通过记录两次下载分片的时间差、对应下载的字节差,计算单位时间的下载量得到实时速度,仅需用到Python标准库time,无需额外安装第三方依赖。
具体修改步骤
- 代码开头新增导入
time模块 - 进入下载循环前初始化时间、已下载字节的统计变量
- 每次下载完一个分片后计算当前速度,将速度字段加入输出内容
- 修正原有代码的两处逻辑问题:一是下载完成会错误打印下载取消的提示,二是每次循环都重复写入整个文件导致效率极低
import time # 新增导入 def download_file(id): fileStats=file_info(id) # 显示文件基础信息 print("----------------------------") print("FileName: ",fileStats['name']) total_size = int(fileStats['size']) # 提前存储总大小,避免重复类型转换 print("FileSize: ",convert_size(total_size)) print("----------------------------") request = service.files().get_media(fileId=id) fh = io.BytesIO() downloader = MediaIoBaseDownload(fh, request, chunksize=1048576) done = False # 新增速度统计相关变量 last_timestamp = time.time() last_downloaded = 0 current_speed = 0 while not done: status, done = downloader.next_chunk() current_downloaded = int(status.progress() * total_size) # 计算实时速度 time_diff = time.time() - last_timestamp if time_diff > 0: current_speed = (current_downloaded - last_downloaded) / time_diff # 更新统计值,供下一次计算使用 last_timestamp = time.time() last_downloaded = current_downloaded # 输出信息新增速度字段,颜色可根据自己的需求调整 ui_update('{1:<10}\t{2:<10}\t{3:<10}\t{0}'.format( fileStats['name'], color(convert_size(total_size), Colors.orange), color(f'{round(status.progress()*100,2)}%', Colors.green), color(f'{convert_size(int(current_speed))}/s', Colors.blue) )) # 下载完成后统一写文件,避免重复写入降低效率 fh.seek(0) with open(os.path.join(location, fileStats['name']), 'wb') as f: f.write(fh.read()) print(f"文件 {fileStats['name']} 下载完成!")
如果你的convert_size函数暂不支持整数以外的输入,也可以手动转换速度单位:显示MB/s可以改成f'{round(current_speed/1048576, 2)} MB/s',显示KB/s就除以1024即可。
内容的提问来源于stack exchange,提问作者blank
相关产品推荐
相关产品推荐

