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

Python中遍历嵌套YAML文件主标签并获取子标签值的方法

问题解决与代码修正

原代码存在的问题

  • 语法错误:configyaml.Chart + index +.Slide这种拼接属性名的写法完全不合法,Python无法识别该属性访问逻辑。
  • 硬编码遍历范围:用range(3)固定遍历3次,若YAML文件新增Chart4这类标签,代码会自动遗漏。
  • 冗余工具使用:Munch库虽能将字典转为对象属性访问,但对于Python新手,直接操作原生字典更直观易懂。

修正后的代码实现

方法1:直接操作YAML加载的字典(推荐)

yaml.safe_load加载后得到的是字典结构,键为Chart1/Chart2/Chart3,值为对应子标签的字典。直接遍历字典键值对即可:

import yaml

# 读取YAML文件
with open(r"C:\Users\ana\Chart\config.yaml", 'r', encoding='utf-8') as stream:
    data_loaded = yaml.safe_load(stream)

# 遍历所有Chart标签
for chart_name, chart_info in data_loaded.items():
    # 可选:过滤非Chart开头的标签
    if chart_name.startswith("Chart"):
        slide_number = chart_info["Slide"]
        top = chart_info["Top"]
        left = chart_info["Left"]
        print(f"--- {chart_name} ---")
        print(f"Slide: {slide_number}")
        print(f"Top: {top}")
        print(f"Left: {left}")

方法2:使用Munch库(若坚持用对象属性访问)

若一定要用Munch,需通过字符串拼接生成属性名,再用getattr动态获取属性:

import yaml
from munch import Munch

# 读取YAML文件并转为Munch对象
with open(r"C:\Users\ana\Chart\config.yaml", 'r', encoding='utf-8') as stream:
    data_loaded = yaml.safe_load(stream)
configyaml = Munch(data_loaded)

# 遍历所有存在的Chart标签
index = 1
while True:
    chart_attr_name = f"Chart{index}"
    if hasattr(configyaml, chart_attr_name):
        chart = getattr(configyaml, chart_attr_name)
        slide_number = chart.Slide
        top = chart.Top
        left = chart.Left
        print(f"--- {chart_attr_name} ---")
        print(f"Slide: {slide_number}")
        print(f"Top: {top}")
        print(f"Left: {left}")
        index += 1
    else:
        break

代码说明

  • 方法1无需硬编码遍历次数,能自动适配YAML中所有Chart标签,扩展性更强。
  • startswith("Chart")判断用于过滤非Chart类主标签,若YAML仅包含Chart开头的标签,可省略该判断。
  • 方法2通过hasattr检查属性是否存在,避免因不存在ChartN标签导致的报错。

内容的提问来源于stack exchange,提问作者Ana Varathan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 09:36:04