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

如何用Python编辑YAML文件并保留原始结构?附示例

如何用Python编辑YAML文件且不破坏原始结构?

这确实是处理YAML时的常见痛点——很多常规库(比如PyYAML)会默认打乱键的顺序、改变格式样式,甚至丢失注释。我经常用ruamel.yaml这个专门为保留YAML原始结构设计的库来解决这类问题,它完美适配你的需求。下面是具体的实现步骤:

1. 安装ruamel.yaml

首先通过pip安装依赖:

pip install ruamel.yaml

2. 编写编辑代码

这个库的核心优势是能读取YAML并完整保留其原始的键顺序、流/块样式、甚至注释。针对你的示例需求,我们可以这样写:

假设你的原始YAML文件original.yaml内容是:

Feature:
  version : 1.0.1
  artifactId : libraries
  groupId : com.fgr.fff.ddds
  extension : zip
  classifier : dfdd
  properties: {storage : ds, aem_group : vbox}
  type : packages
  order : 100

我们要修改version的值,同时保留所有原始结构:

from ruamel.yaml import YAML

# 初始化YAML对象,配置保留原始格式的参数
yaml = YAML()
yaml.preserve_quotes = True  # 保留字符串的引号(如果原始文件有)
yaml.default_flow_style = None  # 保留原始的流样式(比如properties的{}格式)

# 读取原始YAML
with open('original.yaml', 'r') as f:
    yaml_data = yaml.load(f)

# 修改目标字段(比如把version改成1.0.2)
yaml_data['Feature']['version'] = '1.0.2'

# 写入编辑后的内容(可以覆盖原文件,或者写入新文件)
with open('edited.yaml', 'w') as f:
    yaml.dump(yaml_data, f)

3. 验证结果

编辑后的edited.yaml会和你期望的结构完全一致,仅修改了version的值:

Feature:
  version: 1.0.2
  artifactId: libraries
  groupId: com.fgr.fff.ddds
  extension: zip
  classifier: dfdd
  properties: {storage : ds, aem_group : vbox}
  type: packages
  order: 100

为什么不用PyYAML?

PyYAML的safe_load默认会把YAML转成普通的Python字典,虽然Python 3.7+的字典会保留插入顺序,但PyYAML在dump时仍可能调整格式(比如把流样式的properties改成块样式),而且无法保留注释、空行等细节。ruamel.yaml则是从PyYAML fork出来的,专门针对结构保留做了优化,是处理这类需求的最佳选择。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:56:52