如何用Python高效提取JSON文件中的指定字段值?
提取嵌套JSON数据的简化方案及通用处理思路
我正尝试从JSON文件的不同层级中提取数据,目前采用多层for循环的繁琐方式获取嵌套字典中的值。我需要提取所有"title"和"question"字段的值,将其存入列表或Pandas DataFrame中。请问有没有更简便的提取方法?以及如何高效处理JSON文件的通用方案?
JSON示例片段
{ "contact": "xxx", "version": 1.0, "data": [ { "title": "anges-musiciens-(national-gallery)", "paragraphs": [ { "qas": [ { "answers": [{ "text": "La Vierge aux rochers" } ], "question": "Que concerne principalement les documents ?" } ] } ] } ] }
当前使用的代码
titles = [] questions = [] for i in data["data"]: titles.append(i["title"]) for p in i["paragraphs"]: for q in p["qas"]: questions.append(q["question"]) print(titles) print(questions)
一、简化提取的方法
1. 列表推导式替代多层循环
用列表推导式压缩嵌套循环逻辑,代码更紧凑,逻辑与原代码完全一致:
titles = [item["title"] for item in data["data"]] questions = [q["question"] for item in data["data"] for p in item["paragraphs"] for q in p["qas"]]
2. Pandas json_normalize直接生成DataFrame
如果最终目标是存入DataFrame,json_normalize可以自动扁平化嵌套结构,还能保证title与question的对应关系:
import pandas as pd # 扁平化嵌套结构,关联title和对应的question df = pd.json_normalize( data["data"], record_path=["paragraphs", "qas"], # 指定嵌套数组的路径 meta=["title"] # 关联外层的title字段 ) # 保留需要的列 result_df = df[["title", "question"]]
二、高效处理JSON文件的通用方案
- 按需选择解析方式:小文件直接用
json.load()读取为Python字典/列表;超大文件用ijson流式解析,逐段处理避免内存溢出。 - 明确字段层级路径:提前梳理目标字段的层级(比如
data -> [] -> title、data -> [] -> paragraphs -> [] -> qas -> [] -> question),所有提取逻辑围绕路径展开。 - 增加异常防护:实际场景中可能存在字段缺失,用
item.get("title", "")替代item["title"],避免KeyError中断程序。 - 封装通用提取函数:针对重复的JSON结构提取需求,封装函数复用逻辑,比如:
def extract_nested_field(data, path): """从嵌套数据中提取目标字段""" result = [] current_level = data for key in path[:-1]: if isinstance(current_level, list): current_level = [item.get(key, []) for item in current_level] current_level = [item for sublist in current_level for item in sublist] else: current_level = current_level.get(key, []) # 提取最后一层字段 for item in current_level: result.append(item.get(path[-1], "")) return result # 调用示例:提取question字段 questions = extract_nested_field(data["data"], ["paragraphs", "qas", "question"])
内容的提问来源于stack exchange,提问作者Totoro_D
相关产品推荐
相关产品推荐

