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

Python如何创建空YAML对象合并目录多份YAML文件无需占位文件

解决方案

原生无占位文件实现

完全可以不需要提前加载placeholder.yml作为初始对象,你只需要将generated_yaml初始化为空字典{}即可,PyYAML加载出的YAML顶层结构本身就是字典类型,和加载占位文件得到的对象完全兼容。
需要注意两个优化点:

  • 遍历目录时过滤YAML后缀文件,避免加载非YAML格式文件触发报错
  • 判断加载结果是否为字典,空YAML文件加载后会返回None,直接调用update会抛出异常

修改后的代码如下:

import yaml
from yaml import SafeLoader
import os

def yaml_loader(filepath):
    with open(filepath, 'r') as file_descriptor:
        # 生产环境用SafeLoader替代Loader,避免恶意代码执行风险
        data = yaml.load(file_descriptor, SafeLoader)
    return data

rootdir = './yaml_files'
# 直接初始化空字典作为初始合并对象
generated_yaml = {}

for subdir, dirs, files in os.walk(rootdir):
    for file in files:
        # 仅处理yml/yaml后缀文件
        if file.lower().endswith(('.yml', '.yaml')):
            # 可选:如果目录内仍保留placeholder.yml可开启过滤
            # if file == 'placeholder.yml':
            #     continue
            file_path = os.path.join(subdir, file)
            data = yaml_loader(file_path)
            # 仅当加载结果为字典时执行合并
            if isinstance(data, dict):
                generated_yaml.update(data)

print(generated_yaml)

第三方工具推荐

  • 如果你需要处理嵌套YAML的深合并场景:原生dict.update是浅合并逻辑,当两个YAML文件有同名顶层子键时,会直接覆盖整个子对象。如果需要保留非重叠的子键,可以使用deepmerge库,安装命令为pip install deepmerge,调用其深度合并方法替代原生update即可。
  • 如果你需要合并同时做数据格式校验:可以使用pydantic-yaml库,加载YAML的同时直接匹配预定义的数据结构规则,不符合规则的内容会直接抛出校验异常。

内容的提问来源于stack exchange,提问作者Marius Biegger

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 13:15:04