位置:首页 > Scala > PyYAML如何保留多行字符串换行符与缩进空格处理方法

PyYAML如何保留多行字符串换行符与缩进空格处理方法

时间:2026-08-17  |  作者:游戏探长  |  阅读:0

碰到 PyYAML 解析多行字符串时,缩进空格和换行符“丢失”,根源其实很明确:yaml.safe_load() 默认会对多行字符串做“折叠”处理。这样一来,行首空格会被删除,多余换行也会被压缩。

如果你想原封不动保留这些空白字符,必须使用 YAML 的字面量块标量语法:|-

问题根源:默认解析会折叠多行字符串

PyYAML 对字符串的解析,严格遵循 YAML 1.2 规范中关于标量样式的定义。

如果没有特别声明,直接写一段多行字符串,比如 "firstnn second",它会被当作折叠风格流式风格处理。

这时,解析器通常会自动做以下几件事:

  • 把连续的空白行合并成一个换行符(nnn);
  • 去掉每行开头的缩进空格,也就是“缩进基准”会被剥离;
  • 把换行符当成空格分隔符来处理,除非主动启用字面量语义。

为什么会出现空格和换行丢失

所以,当你写下下面这段代码时,缩进空格和额外换行不会被保留:

import yaml
data = yaml.safe_load("firstnn         second")
print(repr(data))  # 输出: 'firstnsecond'

结果就是:缩进空格和额外的换行都没了。

正确解法:使用字面量块标量 |-

核心方案很简单:使用字面量块标量(literal block scalar)。语法以 |- 开头。

  • | 代表保留换行;
  • - 表示去掉末尾多余的那个换行符。

在它后面紧跟一个换行,然后按需要书写内容。这样,所有行首空格、内部换行,甚至制表符,都会原样保留。

示例代码

import yaml

#  正确:使用 |- 显式声明字面量块
data = yaml.safe_load("|-n firstn         second")
print(repr(data))
# 输出: 'firstn         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 字面量块语法 |-,这才是符合规范、稳定可靠、跨解析器兼容的标准方案。

免责声明:文中图文均来自网络,如有侵权请联系删除,心愿游戏发布此文仅为传递信息,不代表心愿游戏认同其观点或证实其描述。

相关文章

更多

精选合集

更多

大家都在玩

热门话题

大家都在看

更多