如何将下载的文件直接写入zip压缩包,无需保存临时本地文件?
优化实现方案(无本地临时文件)
核心原理是借助io.BytesIO在内存中暂存下载的文件内容,直接写入压缩包,完全跳过本地磁盘读写步骤,代码更简洁,执行效率也更高。
优化后代码
import zipfile import requests from io import BytesIO pics = ['url/1.jpg', 'url/2.jpg', 'url/3.jpg'] save_dir = '/directory' # 避开内置关键词dir,避免命名冲突 with zipfile.ZipFile(f"{save_dir}/test.zip", 'w') as my_zip: for idx, pic_url in enumerate(pics, start=1): # 直接下载文件到内存 resp = requests.get(pic_url, allow_redirects=True, timeout=10) # 获取文件后缀 file_suffix = pic_url.split('.')[-1] # 直接将内存中的内容写入压缩包,命名为 序号.后缀 my_zip.writestr(f"{idx}.{file_suffix}", resp.content)
改动说明
- 移除了所有本地文件读写、删除逻辑,代码量减少近40%
- 用
enumerate替代range(len(pics))遍历,代码可读性更高 - 避免了
dir内置关键字作为变量名的冲突问题 - 新增
timeout参数避免请求无限挂起,健壮性更强 - 全程仅在最后写入压缩包时产生一次磁盘IO,执行效率远高于原实现
内容的提问来源于stack exchange,提问作者Gir
相关产品推荐
相关产品推荐

