Python中yaml.dump()输出原始转义字符串不符合预期的原因
输出格式不符的核心原因
PyYAML的dump序列化逻辑默认遵循数据无损优先原则,自动选择字符串输出风格的核心标准是:序列化生成的YAML反序列化后,必须和传入的原始Python对象完全一致,不能出现语义偏差。
- 你预期的单引号折行格式本身就存不住你传入的字符串值。按YAML规范,单引号包裹的折行字符串属于折叠式标量,换行符会被自动替换成空格。比如你期望的输出:
这段内容反序列化后得到的实际值是data: 'a b'a b,原始字符串里a后面紧跟的真实换行会直接丢失,和你传入的'a\n b'(a后接换行,第二行开头是空格加b)根本不是同一个值,PyYAML不可能输出这种会导致数据失真的格式。 - 默认输出双引号加
\n转义的形式是符合YAML规范的无损选择。双引号是YAML里唯一支持用转义序列表示换行、制表符等特殊控制字符的标量风格,用这种格式输出才能100%保证dump后的内容重新load时,得到的字符串和原始传入值完全一致,不会丢字符、改语义。
如果你不想看到转义形式的\n,希望换行直接展示在YAML输出里,得显式指定用字面量块风格输出,参考代码:
import yaml # 标记需要用字面量块格式输出的字符串类型 class LiteralStr(str): pass # 注册对应类型的序列化presenter def _literal_presenter(dumper, data): return dumper.represent_scalar('tag:yaml.org,2002:str', data, style='|') yaml.add_representer(LiteralStr, _literal_presenter) d = {'data': LiteralStr('a\n b')} print(yaml.dump(d))
执行后输出的内容可以无损保留原始换行,格式如下:
data: | a b
内容的提问来源于stack exchange,提问作者zcin
相关产品推荐
相关产品推荐

