Python中创建和修改YAML文件的完整方法
本文详细介绍在 Python 中创建和修改 YAML 配置文件的核心方法。通过 pyyaml 可快速序列化字典生成基础结构;若需原位微调并保留原始注释与缩进,推荐使用 ruamel.yaml。文中附带完整代码、环境安装步骤及读写前后对比效果,助您高效管理项目参数。
Python 创建与修改 YAML 文件的完整指南
准备条件与环境配置
YAML(Yet Another Markup Language)是一种简洁直观的数据序列化格式,广泛应用于项目配置、参数传递及自动化脚本。在 Python 生态中,处理 YAML 文件主要依赖第三方库。根据是否需要保留原文件格式与注释,可选择不同的工具链:
- 若仅需快速生成基础结构或使用方,可使用
pyyaml。 - 若需对现有配置文件进行原地微调,且不希望丢失原有注释、排序与缩进格式,强烈推荐使用
ruamel.yaml。
第1步:安装必要的 Python 扩展库
在终端或虚拟环境中执行以下命令安装所需包:
pip install pyyaml ruamel.yaml
第2步:使用 PyYAML 快速创建 YAML 文件
当需要从零构建一个配置文件时,可将 Python 字典对象直接序列化为 YAML 格式。该方法会覆盖目标路径,因此建议提前确认文件是否存在。
import os
import yaml
# 定义目标数据结构
desired_caps = {
'train': 'dataTrain/2007_train.txt',
'val': 'dataTrain/2007_val.txt',
'nc': 2,
'names': ['a', 'b']
}
# 获取当前脚本目录并拼接目标路径
curpath = os.path.dirname(os.path.realpath(__file__))
yamlpath = os.path.join(curpath, './yamlFile/caps.yaml')
# 确保上级目录存在并写入文件
os.makedirs(os.path.dirname(yamlpath), exist_ok=True)
with open(yamlpath, 'w', encoding='utf-8') as f:
yaml.dump(desired_caps, f, allow_unicode=True)
第3步:使用 PyYAML 简单覆写现有文件数据
通过 yaml.safe_load 读取后直接修改字典键值,再使用 yaml.safe_dump 写回。注意此方式会重新格式化文件,导致原始注释和部分排版丢失。
import os
import yaml
def set_state(state):
file_name = './yamlFile/bottlemldel.yaml'
# 安全读取
with open(file_name, 'r', encoding='utf-8') as f:
doc = yaml.safe_load(f)
# 修改指定字段
doc['nc'] = state
# 覆盖保存,default_flow_style=False 保持块状缩进
with open(file_name, 'w', encoding='utf-8') as f:
yaml.safe_dump(doc, f, default_flow_style=False)
# 调用更新参数
set_state(8)
第4步:使用 ruamel.yaml 精准保留格式修改配置
在处理 GitLab CI、Conda 环境等包含丰富注释的结构化文件时,ruamel.yaml 是更优选择。它能精确解析节点位置,实现增量更新而不破坏原有样式。
以清理 environment.yaml 中 dependencies 列表下的版本后缀为例(删除最后一个等号及之后的内容):
from ruamel.yaml import YAML
yaml_handler = YAML()
yaml_handler.preserve_quotes = True # 保留引号风格
yaml_handler.width = 400 # 控制长行换行宽度
# 读取文件
with open('environment.yaml', 'r', encoding='utf-8') as file:
data = yaml_handler.load(file)
# 遍历并修改目标列表项
dep_list = data['dependencies']
for index in range(len(dep_list)):
cur_item = dep_list[index]
if isinstance(cur_item, str) and '=' in cur_item:
# 仅分割一次,剔除右侧版本号
cleaned_str = cur_item.rsplit('=', 1)[0]
dep_list[index] = cleaned_str
# 覆盖保存至原文件
with open('environment.yaml', 'w', encoding='utf-8') as file:
yaml_handler.dump(data, file)
以下为执行上述逻辑前后的文件形态对比,可见注释结构与缩进均被完整保留:


操作注意事项与排错提示
备份优先:直接覆写(
w模式)会清空原文件内容。批量处理前务必复制一份原始.yaml作为快照,避免不可逆的数据丢失。编码统一:跨平台读写时显式声明
encoding='utf-8'可防止 Windows 环境下出现乱码或UnicodeDecodeError。结构匹配:如果
data['dependencies']返回类型非列表(例如嵌套字典),需先打印type()确认层级关系,避免触发IndexError或TypeError。
总结
日常脚本初始化或底层数据存储推荐直接使用 pyyaml,其 API 简洁且内存占用低;面对生产环境的 CI/CD 配置、模型训练参数集等高频迭代文档,采用 ruamel.yaml 进行节点级编辑能大幅降低人工校对成本。掌握两种工具的适用边界,即可灵活应对各类 Python 配置文件管理需求。
以上就是 Python 创建和修改 YAML 文件的详细内容,更多关于 Python 配置文件管理与 ruamel.yaml 使用技巧的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













