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

