Python 中使用循环与列表推导式提取 JSON 多层嵌套中的云主机名
作者:小确幸
时间:2026-07-18
浏览:3
在Python中提取JSON嵌套的cloud_vm_display_name字段,需遍历列表并用.get()安全访问键值,严格过滤None与字符串'null',避免误判。批量处理多个JSON文件时,结合glob模块匹配文件路径,利用try/except捕获解析错误,确保程序稳健运行。推荐使用递归或循环遍历深层嵌套结构。
从Shell切到Python处理JSON,这事儿在实际项目中太常见了。jq命令虽然好用,但一旦需要集成到Python项目里,或者要批量处理几十个结构参差不齐的JSON文件,直接用Python原生解析显然更可控、更易维护。很多人卡在哪儿呢?SyntaxError: invalid syntax——说白了,就是Python不支持jq那种通配符索引[],必须老老实实遍历列表。
本文内容来源于网友投稿,如有侵权请联系删除。
核心问题:如何在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-09-22 14:38
Python安装后怎么打开:使用IDLE或命令行启动解释器
2026-09-16 13:54
Windows系统Python安装教程:下载、勾选PATH及环境变量配置
2026-09-16 13:53
“等灯不计时”落地解析:算法善意如何转化为技术能力与生态协同
2026-09-08 18:03
英伟达推出NVHBM:定制HBM带宽提升30%并扩展NVLink Fusion生态
2026-09-08 17:31
精品专题
更多
Mac软件
更多
WINDOWS
更多

































