大文件下载应启用stream=true分块处理,用iter_content()逐块写入磁盘,合理设置chunk_size(如8kb–1mb),并添加重试、进度提示和异常处理以保障稳定性。

下载大文件时直接用 requests.get() 容易内存溢出或中断失败,核心思路是“边下边存、分块处理”,避免一次性加载整个响应体。
启用流式下载(stream=True)
这是分块下载的前提。不加 stream=True,requests 会默认把整个响应内容读入内存,对 GB 级文件极不友好。
正确写法:
- 设置
response = requests.get(url, stream=True) - 检查状态码:
response.raise_for_status() - 后续通过
response.iter_content(chunk_size)分批读取
合理设置 chunk_size 控制内存占用
chunk_size 不是越大越好,也不是越小越稳,需平衡内存、磁盘 I/O 和网络效率。
立即学习“Python免费学习笔记(深入)”;
常见建议:
欢迎使用ChuangxinCMS企业网站管理系统软件! ChuangxinCMS是一个采用PHP技术和MYSQL数据库开发的企业网站管理系统,使用ChuangxinCMS能在最短的时间内花费最少的成本来搭建一个功能完善的企业网站,ChuangxinCMS具有一系列完善的内容管理功能,包括文章发布、分类管理、产品发布展示、下载模块等,整个系统页面设计简洁大方,功能实用高效,是中小型企业建站的最佳选择
- 8192(8KB)或 65536(64KB)是较稳妥的默认值
- 下载网速快、内存充足时可试 256KB–1MB
- 嵌入式或低内存环境建议 ≤ 4KB
- 避免设为 1 或过小值(频繁系统调用拖慢速度)
边下载边写入文件,避免缓存堆积
每拿到一块数据就立即写入磁盘,而不是攒起来再写。
示例关键逻辑:
- 用
open(..., 'wb')以二进制写模式打开文件 - 循环中调用
for chunk in response.iter_content(chunk_size=8192): - 每次
f.write(chunk),不额外拼接或转码 - 确保
f.flush()非必需(系统自动缓冲),但可在关键点加os.fsync(f.fileno())提高落盘可靠性(如断电防护)
增加基础健壮性:重试 + 进度提示
真实场景中网络波动常见,简单加个重试和进度显示能极大提升体验。
可补充的做法:
- 用
urllib3.util.retry.Retry或tenacity库自动重试连接失败 - 从
response.headers.get('content-length')获取总大小,配合tqdm显示实时进度条 - 捕获
requests.exceptions.RequestException做兜底处理(如记录失败 URL、暂停后继续) - 下载前检查目标路径是否有写权限,避免中途报错
分块下载本质就是控制数据流动节奏,不复杂但容易忽略细节。只要开启 stream、分块读、及时写、加一点容错,就能稳定处理几 GB 甚至更大的文件。









