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

PyYAML自定义Dumper下长字符串多行输出问题求助:实现单行格式

解决方案:自定义YAML Dumper保持长字符串单行输出

要在自定义缩进的MyDumper中让长字符串保持单行,你可以重写PyYAML的字符串呈现逻辑,强制禁用自动换行。只需在你的自定义Dumper类中添加字符串处理的presenter方法,指定字符串始终以单行形式输出:

import yaml
from yaml.representer import SafeRepresenter

class MyDumper(yaml.Dumper):
    # 保留你原有的自定义缩进逻辑
    def increase_indent(self, flow=False, indentless=False):
        return super().increase_indent(flow, indentless=False)

# 重写字符串呈现逻辑,控制单行输出
def str_presenter(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, style=None)

# 将自定义呈现器注册到MyDumper
MyDumper.add_representer(str, str_presenter)
SafeRepresenter.add_representer(str, str_presenter)  # 兼容SafeDumper逻辑(可选)

# 测试生成YAML
verify_target_str = "interface Vlan6[\\s]+vrrpv3 1 address-family ipv4[\\s]+address 5.2.1.1 primary[\\s]+interface Vlan7[\\s]+vrrpv3 1 address-family ipv4[\\s]+address 5.2.1.2"
data = {"include": [verify_target_str]}

with open("check.yaml", "w") as f:
    yaml.dump(data, f, Dumper=MyDumper, default_flow_style=False, indent=2)

逻辑说明

  • str_presenter方法会根据字符串是否包含换行符选择输出格式:自带换行时保留块格式,无换行则强制单行标量,避免PyYAML自动折行。
  • 完全保留了你原有的自定义缩进逻辑,同时解决长字符串折行问题。

生成的check.yaml会符合你的期望格式:

include:
  - interface Vlan6[\s]+vrrpv3 1 address-family ipv4[\s]+address 5.2.1.1 primary[\s]+interface Vlan7[\s]+vrrpv3 1 address-family ipv4[\s]+address 5.2.1.2

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 10:35:09