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

Python中Jinja2渲染YAML模板时多行字符串格式异常问题

问题分析

你遇到的问题核心不在Jinja2渲染环节,而是PyYAML的序列化逻辑:
当用yaml.safe_load加载渲染后的YAML字符串时,原本的块标量会被解析成Python普通多行字符串;之后如果把处理后的final_data转回YAML输出(比如用yaml.dump),PyYAML默认会给多行字符串套上单引号,而非还原成块标量格式。你换|>、>-这些符号没用,是因为它们只影响YAML的解析过程,解析后都会变成Python字符串,序列化时还是按PyYAML默认规则输出。

解决方案

给你两种实用的解决办法:

方法一:自定义PyYAML的字符串序列化规则

通过自定义序列化器,让PyYAML自动把多行字符串转成块标量输出:

import yaml
from yaml.representer import SafeRepresenter

def multiline_str_representer(dumper, data):
    # 检测到多行字符串时,用块标量格式输出
    if '\n' in data:
        return dumper.represent_scalar('tag:yaml.org,2002:str', data, style='|')
    return dumper.represent_scalar('tag:yaml.org,2002:str', data)

# 注册自定义规则
SafeRepresenter.add_representer(str, multiline_str_representer)

# 后续序列化时用这个规则
final_yaml = yaml.safe_dump(final_data, default_flow_style=False)
print(final_yaml)

方法二:用ruamel.yaml保留原始YAML格式

ruamel.yaml是PyYAML的增强版,能精准保留YAML的原始结构(包括块标量、注释),适合需要维持格式的场景:

  1. 先安装依赖:
pip install ruamel.yaml
  1. 修改代码中的加载和序列化逻辑:
from ruamel.yaml import YAML

# 初始化YAML实例,配置保留格式
yaml = YAML()
yaml.preserve_quotes = True
yaml.default_flow_style = False

# 替换原有的yaml.safe_load
rendered_template = render_template(input_template_path, context)
sample_data = yaml.load(rendered_template)

# 最终输出时用yaml.dump
final_yaml = yaml.dump(final_data)
print(final_yaml)

补充说明

如果只是sample_data的内容正确就行,不需要转回YAML字符串,那其实yaml.safe_load解析后的Python对象是完全正常的,问题只出在将对象重新序列化为YAML的环节。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 08:05:21