发布于2026-07-18 阅读(0)
扫一扫,手机访问
本文介绍如何在 Python 中替代jq '.cis[].properties.cloud_vm_display_name' | grep -v null命令,从多个结构相似但数组长度不一的 JSON 文件中稳健提取cloud_vm_display_name字段值,并规避空值与语法错误。
或许你之前一直在 Shell 里用 jq 处理 JSON 数组,一行命令搞定提取、再 pipe 给 grep 过滤空值,的确干净利落。但一旦搬到 Python 环境,很容易踩一个坑:试图写 data['cis'][] —— 这在 Python 里是非法语法(SyntaxError: invalid syntax),因为列表索引不能为空。正确的思路其实很简单:遍历 data['cis'] 这个列表,逐项访问嵌套字段,同时把空值和无效值过滤掉。下面给出一个完整、鲁棒的处理流程。
import json
# 示例:加载单个 JSON 文件(实际中可循环读取多个文件)
with open("server1.json", "r") as f:
data = json.load(f)
# 提取所有非 null 的 cloud_vm_display_name(严格匹配字符串 'null')
names = []
for cis_item in data.get("cis", []):
props = cis_item.get("properties", {})
name = props.get("cloud_vm_display_name")
# 注意:这里判断 name 是否为 None 或字符串 "null",而非模糊包含 'null'
if name is not None and name != "null":
names.append(name)
print(names) # 输出: ['azuXXXXX', 'azuXXXXX', 'azuXXXXXX', ...]
这个循环写法清晰且易于调试。当然,如果你偏爱一行流,列表推导式也可以同样完成任务:
names = [
cis["properties"]["cloud_vm_display_name"]
for cis in data.get("cis", [])
if cis.get("properties", {}).get("cloud_vm_display_name") not in (None, "null")
]
⚠️ 注意:原始的grep -v null其实是有点粗糙的,它会误杀那些名字里含有"null"子串的合法值(比如"anulled-vm")。更精确的做法是改用!= "null"进行完整的字符串比较,同时把 Python 中的None也考虑进去——这才是语义等价的过滤逻辑。
import glob
import json
all_names = []
for filepath in glob.glob("*.json"): # 匹配所有 JSON 文件
try:
with open(filepath, "r") as f:
data = json.load(f)
for cis in data.get("cis", []):
name = cis.get("properties", {}).get("cloud_vm_display_name")
if name and name != "null": # 安全判空:非 None、非空字符串、非 "null"
all_names.append(name)
except (json.JSONDecodeError, OSError) as e:
print(f"警告:跳过无效文件 {filepath} — {e}")
print(all_names)
有些资料里会写 if not 'null' in name,但这很容易误伤——比如 "cloud_null_server" 这种合法名称就会被无辜过滤掉。真实场景中,JSON 字段如果为空,通常表现为 null(在 Python 中变成 None),或者显式存储为字符串 "null"。所以推荐统一用 name not in (None, "null", "") 来做防御性判断,既简洁又准确。
data['cis'][] —— Python 不支持空索引语法;for 循环或列表推导式遍历 data['cis'];.get() 避免 KeyError,并显式校验 None 和 "null";glob、异常处理,即可无缝替代 cat * | jq ... | grep 流水线。通过以上方法,你不仅能精准复现 jq 的功能,还能获得更强的错误控制、类型安全与可维护性。整个处理过程就像给 JSON 数据做一次精细的“淘金”,既保留了有价值的字段,又把杂质清理得干干净净。
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
8