Python 下载大文件优化方法

1次阅读

python下载大文件需流式下载+分块读取+连接复用+断点续传:设stream=true后用iter_content(chunk_size=8192)边下边写,禁用text/json;用with open(‘wb’)安全写入;加user-agent、session复用连接;支持range时按已下载字节数续传。

Python 下载大文件优化方法

Python 下载大文件时,默认的 requests.get() 容易内存溢出、速度慢、断连失败,核心优化方向是:流式下载 + 分块读取 + 连接复用 + 断点续传。

启用流式下载(stream=True)

不加 stream=True 会把整个响应体一次性加载进内存,几 GB 文件直接 OOM。开启后,响应体以迭代方式按需读取:

  • 必须设置 stream=True,否则 iter_content 无效
  • 推荐配合 response.iter_content(chunk_size=8192) 每次读取 8KB,平衡 I/O 和内存
  • 避免调用 response.textresponse.json() —— 它们会强制加载全部内容

使用 with open(…, ‘wb’) 写入磁盘

边下载边写入文件,不缓存到内存;同时确保异常时文件句柄自动关闭:

  • with open(filename, 'wb') as f: 管理文件,安全可靠
  • 每次从 iter_content 取 chunk 后立即 f.write(chunk)
  • 不要先拼接所有 chunk 成 bytes 再写入 —— 失去流式意义

添加请求头与连接复用

提升成功率和速度,尤其对支持 Range 请求的服务器:

立即学习Python免费学习笔记(深入)”;

  • 加上 'User-Agent' 防止被服务端拒绝
  • 复用 requests.Session() 复用 TCP 连接,减少握手开销
  • 对支持断点续传的接口,可加 'Range': 'bytes=0-'(首次)或续传偏移量(如 'bytes=1024000-'

简单断点续传实现

下载中途失败后,从已写入的字节数继续,避免重头开始:

  • 先检查本地文件是否存在,用 os.path.getsize() 获取已下载字节数
  • 若文件存在且非空,设置请求头 'Range': f'bytes={file_size}-'
  • 响应状态码应为 206 Partial Content(不是 200),确认服务端支持
  • 打开文件用 'ab' 模式追加写入,而非覆盖

不复杂但容易忽略 —— 关键是别让响应体进内存、别手动拼大 bytes、别忽略服务端是否支持 Range。

text=ZqhQzanResources