发布于2026-07-18 阅读(0)
扫一扫,手机访问
核心问题:如何在Python中替代jq '.cis[].properties.cloud_vm_display_name' | grep -v null这条命令,从多个结构不一的JSON文件中稳健提取cloud_vm_display_name字段值,同时避免语法错误和空值误判。

{
"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字段时。
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;
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
8