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

如何让ruamel.yaml仅对多行字符串使用Literal样式输出

自定义ruamel.yaml Dumper,仅对多行字符串使用Literal样式

要实现只对包含换行符的字符串应用Literal(|)样式,其他字符串保持默认格式,你可以通过**自定义字符串代表器(representer)**来实现,而非全局设置default_style。以下是完整实现:

import sys
from ruamel.yaml import YAML

def str_presenter(dumper, data):
    # 判断字符串是否包含换行符
    if '\n' in data:
        # 对多行字符串使用Literal样式,自动处理为|-(保留换行、去除末尾空行)
        return dumper.represent_scalar('tag:yaml.org,2002:str', data, style='|')
    # 单行字符串沿用默认样式
    return dumper.represent_scalar('tag:yaml.org,2002:str', data)

# 初始化YAML实例并注册自定义代表器
yaml = YAML()
yaml.representer.add_representer(str, str_presenter)

# 测试数据
data = {"a": "hello", "b": "hello\nthere\nworld"}

# 输出结果
yaml.dump(data, sys.stdout)

输出结果

a: hello
b: |-
  hello
  there
  world

关键说明

  • 自定义的str_presenter会针对每个字符串做判断:仅当字符串包含换行符时,才启用Literal样式;单行字符串保持原生格式,避免不必要的引号或格式冗余。
  • 不要使用全局default_style="|",它会强制所有字符串(包括字典键和单行值)都应用Literal样式,不符合需求。
  • 若需要保留多行字符串末尾的空行,可将style='|'改为style='|+',对应YAML的|+格式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 20:32:39