ooolinux 发表于 2025-4-4 00:24:36

使用response=requests.get()下载图片,图片保存为文件时

使用response=requests.get()下载图片,图片保存为文件时为什么需要response.iter_content()逐块写入文件?
例如:
for diskStorage in response.iter_content(10240):
    pictFile.write(diskStorage)

FishC 发表于 2025-4-4 00:25:12

关于使用 response.iter_content() 逐块写入图片文件的原因

主要出于以下两个核心考量:

1. 内存控制
- 直接使用 response.content 会一次性将整个文件加载到内存
- 大文件(如视频/高清图)可能导致内存溢出(OOM)
- iter_content() 通过分块加载(如10240字节)减少内存峰值

2. 网络稳定性
- 分块写入可应对不稳定的网络连接
- 若中途断开连接,已写入的块数据不会丢失
- 特别适合大文件下载场景


import requests

url = "http://example.com/image.jpg"
response = requests.get(url, stream=True)# 关键参数

with open("image.jpg", "wb") as f:
    for chunk in response.iter_content(10240):# 分块写入
      if chunk:# 过滤空块
            f.write(chunk)


注意:必须设置 stream=True 参数才能启用流式传输,否则仍然会强制加载完整内容到内存

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

ooolinux 发表于 2025-4-4 00:30:58

FishC 发表于 2025-4-4 00:25
关于使用 response.iter_content() 逐块写入图片文件的原因

主要出于以下两个核心考量:


requests.get(url, stream=True) 函数调用是立即返回接着执行后面的代码,还是全部下载完成才返回?

player-none 发表于 2025-4-4 09:16:06

为了防止文件太大,内存溢出之类的问题

你可以联想浏览器加载超大图片时一块一块加载

ooolinux 发表于 2025-4-4 12:10:48

player-none 发表于 2025-4-4 09:16
为了防止文件太大,内存溢出之类的问题

你可以联想浏览器加载超大图片时一块一块加载

应该是这样了
页: [1]
查看完整版本: 使用response=requests.get()下载图片,图片保存为文件时