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

使用yaml.SafeDumper时如何保留YAML原格式?

解决方案

要保留原YAML中的双引号字符串格式和行内数组格式,需要通过自定义PyYAML的Dumper类,分别重写字符串和列表的序列化逻辑:

1. 强制字符串使用双引号输出

PyYAML默认会根据字符串内容自动判断是否加引号,我们可以自定义字符串的representer,强制所有字符串用双引号包裹。

2. 强制列表使用行内(Flow)格式

默认列表会被序列化为多行block格式,需要修改列表的representer,指定使用flow style输出。

完整修改代码

import yaml

class MyDumper(yaml.SafeDumper):
    def write_line_break(self, data=None):
        super().write_line_break(data)
        if len(self.indents) == 1:
            super().write_line_break()
        if len(self.indents) == 2:
            super().write_line_break()

# 自定义字符串representer:强制双引号
def str_presenter(dumper, data):
    return dumper.represent_scalar('tag:yaml.org,2002:str', data, style='"')

# 自定义列表representer:强制行内格式
def list_presenter(dumper, data):
    return dumper.represent_sequence('tag:yaml.org,2002:seq', data, flow_style=True)

# 注册自定义规则
MyDumper.add_representer(str, str_presenter)
MyDumper.add_representer(list, list_presenter)

# 读取YAML的函数不变
def open_file(input_file):
    with open(input_file, encoding="utf8") as file:
        return_file = yaml.safe_load(file)
        return return_file

# 导出YAML的函数
def dump_file(runtime_file, output_file_name):
    with open(output_file_name, "w", encoding="utf8") as dump_file:
        yaml.dump(runtime_file, dump_file, Dumper=MyDumper, sort_keys=False, allow_unicode=True)

测试效果

使用上述代码处理后,导出的YAML内容会和原文件一致:

Version: "1.0"
title1: "Title 1"
title2: [Title 2]

说明

  • str_presenter函数通过style="'"指定字符串用双引号序列化;
  • list_presenter函数通过flow_style=True强制列表使用行内方括号格式;
  • 把这两个规则注册到自定义的MyDumper中,就能在dump时应用这些格式规则。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 21:39:36