如何在Python requests场景下不加载完整JSON文件提取指定键值
大体积JSON流式提取(Python requests场景)
可以实现无需加载完整JSON即可提取目标键值,核心依赖requests的流式响应能力+增量JSON解析工具,具体方案如下:
实现原理
常规的response.json()方法需要等待完整响应下载完成后,把整个JSON结构加载到内存再解析,对于GB级的大JSON会占用极高内存甚至直接OOM。
而用以下方案可以避免这个问题:
- 开启requests的流式响应模式,仅先获取响应头,响应体逐块迭代获取,不需要一次性下载完整内容
- 搭配增量JSON解析库(如ijson)边接收数据边解析,匹配到目标键值后即可直接终止处理,不需要解析完整JSON结构
操作步骤
1. 安装依赖
使用ijson作为流式JSON解析工具,执行命令安装:pip install ijson
2. 流式请求+解析示例
import requests import ijson # 加stream=True开启流式请求 resp = requests.get("你的请求地址", stream=True) # 第二个参数为目标键的JSON路径,层级用.分隔,数组元素用.item标识 # 示例为提取blocks数组下所有元素的hash字段,你可以根据实际结构调整路径 for hash_val in ijson.items(resp.raw, "blocks.item.hash"): print(f"提取到目标值:{hash_val}") # 拿到所需的所有值后可以直接break,停止后续下载和解析 break
扩展说明
- 该方案同样适配本地大体积JSON文件的解析,只需要把本地文件的文件对象传入
ijson.items即可,无需读取完整文件到内存。 - 对于多层嵌套的JSON结构,只需要按照层级拼接路径即可,比如要提取
blocks下tx数组的value字段,路径可以写为blocks.item.tx.item.value。 - 实测该方案解析10GB级JSON文件内存占用可以稳定在100MB以内,仅提取单个键值的场景下速度比全量解析快5~10倍。
内容的提问来源于stack exchange,提问作者user13581867
相关产品推荐
相关产品推荐

