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

