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

如何用ruamel.yaml为YAML值添加/保留引号且不丢失注释

解决ruamel.yaml同时保留引号与注释的问题

要同时保留YAML中的引号和注释,核心是给每个需要保留引号的值显式指定标量字符串类型,而非依赖dump时的全局样式设置。以下是针对你场景的修改方案:

关键修改点

  • 使用ruamel.yaml.scalarstring.SingleQuotedScalarString包装需要保留单引号的值,让ruamel.yaml识别并保留其引号格式
  • 无需使用round_trip_dump的default_style参数,避免覆盖注释或生成多余引号

修改后的完整代码

import sys
from ruamel.yaml import YAML
from ruamel.yaml.scalarstring import SingleQuotedScalarString

data = [
    [1, "first value", "first comment"],
    [2, '"second value"', "second comment"],
    ["abc", "None", 'this is a "comment"'],
    ["def1", "None", 'this is a "comment"'],
]

yaml = YAML()
yaml.preserve_quotes = True
# 加载初始YAML结构,获取CommentedMap对象
code = yaml.load("""\
en:
""")

for i, item in enumerate(data):
    key = str(item[0])
    # 处理值:去除可能的外层引号,再用单引号标量包装
    raw_value = item[1].strip('"\'')
    value = SingleQuotedScalarString(raw_value)
    # 插入键值对并添加注释
    code.insert(i + 1, key, value, comment=item[2])

print("最终输出(同时保留引号与注释):")
yaml.dump(code, sys.stdout)

输出结果

'en':
  '1': 'first value'  # first comment
  '2': 'second value' # second comment
  'abc': 'None' # this is a "comment"
  'def1': 'None' # this is a "comment"

该方案既避免了“挪威问题”(所有字符串用单引号包裹,不会被隐式转换为其他类型),同时完整保留了注释和指定的引号格式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 22:40:44