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

