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

