如何使用PyCGNS提取CGNS文件中的所有zone列表?
PyCGNS提取CGNS文件全部Zone实现方案
PyCGNS读入的CGNS树遵循统一节点结构:每个节点格式为[节点名, 节点值, 子节点列表, 节点类型],所有Zone节点均归属在CGNSBase_t类型的Base节点下,节点类型固定为Zone_t,直接遍历筛选即可得到目标列表。
完整代码
# 导入PyCGNS的MAP模块(midlevel API,最常用的读入方式) import CGNS.MAP as CGM # 替换为你的CGNS文件实际路径,读取得到完整树结构 tree, _, _ = CGM.load("your_file.cgns") zone_list = [] # 先遍历根节点下的所有Base节点(兼容含多个Base的CGNS文件) for root_child in tree[2]: if root_child[3] == "CGNSBase_t": # 遍历Base下的子节点,筛选所有Zone类型节点 for base_child in root_child[2]: if base_child[3] == "Zone_t": zone_list.append(base_child) # 验证结果 print(f"提取到Zone总数:{len(zone_list)}")
运行后zone_list就是你需要的[zone1, zone2, ..., zoneN]格式列表,列表内每个元素为完整的Zone节点对象,包含Zone名称、网格尺寸、网格坐标、边界条件等全部关联信息。
简化写法(适配你提供的文件结构)
从你贴的print(tree)输出可以看到,当前文件只有1个Base节点,且是根节点下的第二个子节点(第一个为CGNS版本信息节点),可以直接用列表推导式快速提取,代码更短:
# 单Base文件快速提取 base_node = tree[2][1] zone_list = [node for node in base_node[2] if node[3] == "Zone_t"]
节点取值说明
提取后如果需要读取Zone的具体属性,直接按节点结构索引即可:
- 取Zone名称:
zone[0],比如你示例里的zone41 - 取Zone网格尺寸数组:
zone[1],和你打印输出里的3行3列尺寸数组一致 - 取Zone下的子节点(比如坐标、边界条件):遍历
zone[2]按节点类型筛选即可
注意事项
- 不要用截断的
print(tree)打印结果做字符串解析,必须使用CGM.load()读取到的完整tree对象遍历,否则会因为输出截断漏Zone。 - 如果你是用PyCGNS的低级cgnslib API打开的文件,建议先转成midlevel树结构再遍历,避免手动维护文件ID、节点索引的冗余代码。
内容的提问来源于stack exchange,提问作者user19316680
相关产品推荐
相关产品推荐

