求助:Python中等价于jq命令的多JSON文件云VM名称提取方法
在Python中遍历多个JSON文件的
cis数组提取cloud_vm_display_name字段 核心问题解决
你写的data1['cis'][]是错误语法,Python里遍历数组得用for循环迭代元素,不能照搬jq的写法。下面是具体实现方案:
1. 处理单个JSON文件
先看单个文件的处理逻辑,加载JSON后遍历cis数组,提取目标字段并过滤null值:
import json # 加载单个JSON文件 with open('example.json', 'r') as f: data = json.load(f) # 遍历cis数组,提取目标字段 for item in data.get('cis', []): vm_name = item.get('properties', {}).get('cloud_vm_display_name') if vm_name is not None: # 过滤null值 print(vm_name)
用get()方法能避免字段不存在时抛出KeyError,哪怕cis或properties不存在,代码也不会报错。
2. 批量处理多个JSON文件
要处理目录下所有JSON文件,用glob模块批量匹配文件逐个处理:
import json import glob # 匹配当前目录下所有.json文件 json_files = glob.glob('*.json') for file_path in json_files: with open(file_path, 'r') as f: try: data = json.load(f) # 遍历cis数组 for item in data.get('cis', []): vm_name = item.get('properties', {}).get('cloud_vm_display_name') if vm_name is not None: print(vm_name) except json.JSONDecodeError: print(f"跳过无效JSON文件: {file_path}")
这段代码会自动遍历所有JSON文件,跳过解析失败的文件,同时过滤掉cloud_vm_display_name为null的结果,和你之前用jq命令的效果完全一致。
关键说明
- Python没有
data['cis'][]这种语法,必须用for item in data['cis']迭代数组元素 - 使用
dict.get(key, 默认值)可以安全访问嵌套字段,避免因字段缺失导致程序崩溃 - 加入
try-except块处理无效JSON文件,提升代码健壮性
内容的提问来源于stack exchange,提问作者Amit Sharma
相关产品推荐
相关产品推荐

