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

