如何更新YAML文件版本号?解决引号丢失与排序异常问题
问题描述
原始YAML文件内容:
id: "bundle-1" version: "1" apiVersion: "1" description: "Desc" jcasc: - "jenkins.yaml" plugins: - "plugins.yaml"
需求是将文件中的version数值加1,但尝试以下代码后,输出丢失了双引号且字段顺序被打乱:
import sys from ruamel.yaml import YAML import yaml file_name = 'bundle.yaml' yaml.preserve_quotes = True with open(file_name) as yml_file: data = yaml.safe_load(yml_file) value = int(data['version']) print(type(value)) value += 1 str(value) print(type(value)) data['version'] = str(value) data = str(data) print(value) with open(file_name, 'w') as yaml_file: yaml_file.write( yaml.dump(data, sys.stdout))
错误输出结果:
id: bundle-1 apiVersion: 1 description: Desc jcasc: - jenkins.yaml plugins: - plugins.yaml version: 1
请问如何正确实现YAML版本号递增并保留原有格式?
解决方案
问题根源
- 混用了
PyYAML和ruamel.yaml,但实际用的是PyYAML的safe_load,它会丢弃原文件的引号、字段顺序等格式信息。 str(value)这行没有赋值给变量,属于无效操作,无法将数值转为字符串。- 把
data转为字符串后再dump,完全错误地处理了YAML序列化逻辑。
正确代码实现
使用ruamel.yaml处理,它原生支持保留YAML文件的原有格式、引号和字段顺序:
from ruamel.yaml import YAML file_name = 'bundle.yaml' # 初始化YAML对象,配置保留引号和原有结构 yaml = YAML() yaml.preserve_quotes = True yaml.width = 4096 # 避免自动换行破坏格式 # 读取原文件,保留所有格式信息 with open(file_name, 'r', encoding='utf-8') as f: doc = yaml.load(f) # 递增version并转为字符串(确保保留引号) current_ver = int(doc['version']) doc['version'] = str(current_ver + 1) # 写回文件,完全保留原有格式 with open(file_name, 'w', encoding='utf-8') as f: yaml.dump(doc, f)
关键说明
ruamel.yaml是为YAML文件的编辑场景设计的,相比PyYAML更适合需要保留原格式的需求。- 设置
preserve_quotes=True确保所有原有字符串的双引号被保留。 - 始终使用
ruamel.yaml的load和dump方法,不要混用其他YAML库的接口。 - 修改后将版本号转为字符串,保证写入时仍为带引号的字符串类型,与原文件格式一致。
内容的提问来源于stack exchange,提问作者lankan
相关产品推荐
相关产品推荐

