如何在Python中剔除JSON文件中缺少指定键的字典?
嵌套JSON筛选与字段提取方案
需求说明
现有大型嵌套JSON结构,需提取其中FLOODING、date、filename三个字段的键值对,但部分子字典缺失filename字段,导致原提取函数无法生成等长数组。需要先剔除缺失必填键的字典,再完成字段提取,也可选择将筛选后的结果保存为新JSON文件后再处理。
解决方案
方案1:先筛选有效字典,再提取字段
先递归遍历JSON结构,收集所有包含FLOODING、date、filename三个必填键的字典,再从这些有效字典中提取对应字段值,确保数组长度一致。
筛选有效字典的函数
def filter_valid_dicts(obj): """递归遍历嵌套JSON,筛选出包含所有必填键的字典""" valid_dicts = [] def traverse(item): if isinstance(item, dict): # 检查当前字典是否包含全部必填字段 required_keys = {'FLOODING', 'date', 'filename'} if required_keys.issubset(item.keys()): valid_dicts.append(item) # 继续遍历子层级 for value in item.values(): traverse(value) elif isinstance(item, list): for elem in item: traverse(elem) traverse(obj) return valid_dicts
提取字段并生成等长数组
# 假设原始JSON数据存储在变量data中 valid_data = filter_valid_dicts(data) # 批量提取各字段 flooding_values = [d['FLOODING'] for d in valid_data] date_values = [d['date'] for d in valid_data] filename_values = [d['filename'] for d in valid_data]
方案2:合并筛选与提取为单一函数
直接在递归遍历过程中完成筛选和字段提取,一步得到三个等长数组:
def extract_filtered_fields(obj): """递归提取符合条件的字段,返回三个等长数组""" flooding = [] dates = [] filenames = [] def traverse(item): if isinstance(item, dict): required_keys = {'FLOODING', 'date', 'filename'} if required_keys.issubset(item.keys()): flooding.append(item['FLOODING']) dates.append(item['date']) filenames.append(item['filename']) # 遍历子元素 for val in item.values(): traverse(val) elif isinstance(item, list): for elem in item: traverse(elem) traverse(obj) return flooding, dates, filenames # 使用示例 flooding_arr, date_arr, filename_arr = extract_filtered_fields(data)
保存筛选后的JSON到文件
如果需要将筛选后的有效字典保存为新文件,可执行以下代码:
import json valid_data = filter_valid_dicts(data) with open('filtered_flood_data.json', 'w', encoding='utf-8') as f: json.dump(valid_data, f, indent=2)
内容的提问来源于stack exchange,提问作者mountainscaler
相关产品推荐
相关产品推荐

