大话性能 Python 下载大文件

大话性能 · 2023年06月09日 · 2821 次阅读

背景

日常很多下载器不能满足需要,很多码农都想自己写代码从头下载,但是有时候会遇到要下载的文件非常大,导致内存装不下,经常出现下载失败的状况,白白耗了半天时间,非常让人头疼。当遇到这种问题,那只能是 get 一部分数据就往磁盘写,每次保证内存中只有小量级数据即可。

Python 下载文件的方法有两种:

  1. Python 官方的 urlib 库
  2. Python 第三方包 requests

这两个库各有优劣,以前很多人都建议使用 urlib,但是却没人说的出啥理由,现在很多人慢慢喜欢了 requests 库,主要是 requests 库非常简洁,更高层,上手快,单 requests 库对一些需要 ssl 认证的却有些问题。
下面具体讲解使用 urlib 和 requests 库下载大文件的方法:

使用 requests 库下载大文件

当使用 requests 的 get 下载大文件/数据时,建议使用使用 stream 模式。

当把 get 函数的 stream 参数设置成 False 时,它会立即开始下载文件并放到内存中,如果文件过大,有可能导致内存不足。

当把 get 函数的 stream 参数设置成 True 时,它不会立即开始下载,当你使用 iter_content 或 iter_lines 遍历内容或访问内容属性时才开始下载。需要注意一点:文件没有下载之前,它也需要保持连接。

iter_content:一块一块的遍历要下载的内容
iter_lines:一行一行的遍历要下载的内容
使用上面两个函数下载大文件可以防止占用过多的内存,因为每次只下载小部分数据。

示例代码:

r = requests.get(url_file, stream=True)
with open("file_path", "wb") as f
  # chunk是指定每次写入的大小,每次只写了512byte
  for chunk in r.iter_content(chunk_size=512):
      if chunk:
          f.write(chunk)

更多内容可以学习《测试工程师 Python 工具开发实战》书籍

暂无回复。
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册