如何在 PyYAML 中保留多行字符串中的换行符与缩进空格
PyYAML默认解析多行字符串时折叠换行并删除缩进空格,使用字面量块标量`|-`可原样保留换行符与缩进空格,注意`|-`后须紧跟换行符且块内缩进不能少于首行,这是YAML字面量块标量的标准用法。
碰到 PyYAML 解析多行字符串时,发现缩进空格和换行符莫名其妙“丢了”,是不是挺让人抓狂的?其实问题根源很清晰:yaml.safe_load() 默认对多行字符串做“折叠”处理——行首空格被删除,多余换行也被压缩了。要想原封不动保留这些空白字符,必须祭出 YAML 的字面量块标量语法:|-。
PyYAML 对字符串的解析,严格遵循 YAML 1.2 规范中关于标量样式的定义。如果没有特别声明,直接写一段多行字符串(比如 "first\n\n second"),它会被当作折叠风格或流式风格来处理。这时候,解析器会自动做三件事:
- 把连续的空白行合并成一个换行符(
\n\n→\n); - 去掉每行开头的缩进空格(也就是所谓的“缩进基准”被剥离了);
- 把换行符当成空格分隔符来对待(除非主动启用字面量语义)。
所以当你写下这段代码时:
import yaml
data = yaml.safe_load("first\n\n second")
print(repr(data)) # 输出: 'first\nsecond'
结果自然就是——缩进空格和额外的换行,全没了。
正确解法:用字面量块标量 |-
核心方案其实很简单:使用字面量块标量(literal block scalar)。语法是 |- 开头,其中 | 代表保留换行,- 表示去掉末尾多余的那个换行符。后面紧跟一个换行,然后按你需要的格式书写内容即可——所有行首空格、内部换行、甚至制表符,都会原样保留。
看个清楚点的例子:
import yaml
# ✅ 正确:使用 |- 显式声明字面量块
data = yaml.safe_load("|-\n first\n second")
print(repr(data))
# 输出: 'first\n second'
# 更贴近真实场景的用法(带缩进的 YAML 片段)
yaml_text = """
config:
description: |-
This is line one.
This line starts with 4 spaces.
And this is line three, aligned with line one.
"""
parsed = yaml.safe_load(yaml_text)
print(repr(parsed["config"]["description"]))
# 输出: 'This is line one.\n This line starts with 4 spaces.\nAnd this is line three, aligned with line one.'
注意事项,容易踩坑的地方
|-后面必须紧跟着换行符,否则解析会直接失败;- 字面量块里,所有行首空格都会被保留,包括首行之后的内缩进。但要注意,YAML 要求块内的缩进不能少于首行的缩进,否则会报错;
- 末尾换行的处理:
|-是去掉末尾换行,|是保留末尾换行,>则是将换行折叠成空格(这个场景下不太常用); - 千万不要在字面量块中混用制表符和空格缩进,这很容易触发解析异常;
- 如果在 Python 代码中用三引号
"""书写多行 YAML,注意首行缩进要对齐,或者借助textwrap.dedent清理一下多余的缩进。
总结一句话:当你需要精确控制多行字符串里的空白字符(尤其是既要保留缩进空格,又要保留换行符时),千万别依赖默认的解析行为。主动使用 YAML 字面量块语法 |- —— 这才是符合规范、稳定可靠、跨解析器兼容的标准方案。
Windows 10 是一款微软推出的经典操作系统,拥有硬件兼容性与多任务处理能力。它更偏向把系统状态查看和常用调节动作放在一起,适合需要持续观察和微调设备状态的场景。
极度公式是一款跨平台专业LaTeX公式识别编辑软件,支持OCR公式识别和多平台编辑。和使用说明,避免使用,享受完整功能与稳定支持。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。
















