Python 中使用循环与列表推导式提取 JSON 多层嵌套中的云主机名
在Python中提取JSON嵌套的cloud_vm_display_name字段,需遍历列表并用.get()安全访问键值,严格过滤None与字符串'null',避免误判。批量处理多个JSON文件时,结合glob模块匹配文件路径,利用try/except捕获解析错误,确保程序稳健运行。推荐使用递归或循环遍历深层嵌套结构。
核心问题:如何在Python中替代jq '.cis[].properties.cloud_vm_display_name' | grep -v null这条命令,从多个结构不一的JSON文件中稳健提取cloud_vm_display_name字段值,同时避免语法错误和空值误判。

✅ 正确做法:遍历 data1['cis'] 列表
假设已经通过json.load()把单个JSON文件读成了字典data1,结构大概是这个样子:{
"cis": [
{
"properties": {
"cloud_vm_display_name": "azuXXXXX",
"TenantsUses": [ ... ]
}
},
{
"properties": {
"cloud_vm_display_name": "null",
...
}
}
]
}
那么,正确的做法是安全遍历加显式空值检查。推荐两种写法,看场景选:
# 方案 1:基础 for 循环(清晰易调试)
vm_names = []
for cis_item in data1.get('cis', []):
props = cis_item.get('properties', {})
name = props.get('cloud_vm_display_name')
# 注意:'null' 是字符串,不是 None;需区分 'null' 字面量 vs None/缺失值
if name is not None and name != 'null':
vm_names.append(name)
print(vm_names) # ['azuXXXXX', 'azuXXXXXX', ...]
# 方案 2:简洁列表推导式(生产推荐)
vm_names = [
cis['properties']['cloud_vm_display_name']
for cis in data1.get('cis', [])
if cis.get('properties', {}).get('cloud_vm_display_name') not in (None, 'null')
]
⚠️ 关键提醒:
if 'null' in name这种写法存在严重逻辑缺陷——它会错误过滤掉"anulled-server"或"nullified-db"这类合法名称;grep -v null在Shell中实际匹配的是整行等于"null"的输出,Python中应严格比对== 'null'或检查is None;- 更健壮的做法是使用
.get(key, default)避免KeyError,尤其当某些cis条目可能缺失properties或cloud_vm_display_name字段时。
批量处理多个 JSON 文件
如果要对标原始命令cat * | jq ...,处理目录下所有.json文件,可以用glob加上异常处理:import json
import glob
all_vm_names = []
for filepath in glob.glob("*.json"):
try:
with open(filepath, encoding='utf-8') as f:
data = json.load(f)
# 对每个文件提取 names
names = [
cis.get('properties', {}).get('cloud_vm_display_name')
for cis in data.get('cis', [])
]
# 过滤掉 None 和字符串 'null'
valid_names = [n for n in names if n not in (None, 'null')]
all_vm_names.extend(valid_names)
except (json.JSONDecodeError, OSError) as e:
print(f"跳过无效文件 {filepath}: {e}")
print(all_vm_names)
✅ 最佳实践总结
- ❌ 避免
if 'null' in name——语义错误,易误伤; - ✅ 使用
name != 'null' and name is not None或name not in (None, 'null'); - ✅ 始终用
.get()访问嵌套键,防止KeyError; - ✅ 批量处理时加入try/except,保障程序鲁棒性;
- ✅ 若需完全复刻jq '.cis[].properties.cloud_vm_display_name | values'行为(自动跳过null/undefined),Python中等价逻辑即:仅保留非None且非'null'的字符串值。
Photoshop 2026 是 Adobe 推出的专业图像处理与视觉设计软件,支持 Windows、macOS 和 iPad 等平台,广泛应用于摄影修图、电商设计、平面海报、数字绘画及视觉合成等创作场景。
Blender 是一款免费开源、跨平台的专业 3D 创作软件,集建模、动画、渲染、视频编辑与视觉合成等功能于一体,广泛应用于影视动画、游戏设计和建筑可视化等领域。软件支持 Cycles 物理渲染器与 Eevee 实时渲染引擎,并提供多边形建模、骨骼绑定、物理模拟等专业工具。Blender 兼容 Windows、macOS 和 Linux 系统,安装包轻巧、运行流畅,依托活跃的全球开发者社区持续更新,是从初学者到专业创作者都值得选择的正版 3D 创作工具。
Photoshop 2026 是 Adobe 推出的专业图像处理与视觉设计软件,支持 Windows、macOS 和 iPad 等平台,广泛应用于摄影修图、电商设计、平面海报、数字绘画及视觉合成等创作场景。
Blender 是一款免费开源、跨平台的专业 3D 创作软件,集建模、动画、渲染、视频编辑与视觉合成等功能于一体,广泛应用于影视动画、游戏设计和建筑可视化等领域。软件支持 Cycles 物理渲染器与 Eevee 实时渲染引擎,并提供多边形建模、骨骼绑定、物理模拟等专业工具。Blender 兼容 Windows、macOS 和 Linux 系统,安装包轻巧、运行流畅,依托活跃的全球开发者社区持续更新,是从初学者到专业创作者都值得选择的正版 3D 创作工具。















