You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 21:33:43