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
相关产品推荐
相关产品推荐

