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

如何更新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版本号递增并保留原有格式?


解决方案

问题根源

  1. 混用了PyYAML和ruamel.yaml,但实际用的是PyYAML的safe_load,它会丢弃原文件的引号、字段顺序等格式信息。
  2. str(value)这行没有赋值给变量,属于无效操作,无法将数值转为字符串。
  3. 把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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 11:00:46