You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ruamel.yaml往返序列化时保留长单行字符串的方法

解决ruamel.yaml长单行标量自动换行的问题

用ruamel.yaml的round-trip模式转储YAML时,长单行文本会自动拆成多行,调大yaml.width又会把原本的多行字符串合并成单行,两头为难?试试下面的方法:

关键逻辑

ruamel.yaml的round-trip模式会记住标量的原始格式标记,比如用|或>标记的多行文本,加载后会被特殊处理,dump时完全保留原样,不受换行宽度限制。所以分两种情况处理:

  • 要保持单行的长文本:不用加任何标记,直接设yaml.width为无限大(float("inf")),就不会自动换行。
  • 要保持多行的文本:在原始YAML里用|(保留所有换行)或>(把换行转成空格,但保留段落分隔)标记,转储时就不会被合并成单行。

实际代码示例

import ruamel.yaml
import sys

yaml_str = """\
long_single_line_text: Hello, there. This is nothing but a long single line text which is more that a 100 characters long
multi_line_text: |
  This is a multi-line text
  that should stay as multiple lines
  after dump
"""

yaml = ruamel.yaml.YAML()  # 默认是round-trip模式
yaml.preserve_quotes = True
yaml.allow_duplicate_keys = True
yaml.explicit_start = True
yaml.width = float("inf")  # 彻底禁用自动换行

data = yaml.load(yaml_str)
yaml.dump(data, sys.stdout)

输出效果

---
long_single_line_text: Hello, there. This is nothing but a long single line text which is more that a 100 characters long
multi_line_text: |
  This is a multi-line text
  that should stay as multiple lines
  after dump

注意点

如果你的多行文本没加|/>标记,只是直接换行,那YAML本身会把这些换行当成空格解析成单行字符串,转储时自然会输出成单行。这种情况要保留换行,必须在原始YAML里加上|标记——毕竟加载的时候换行信息已经丢了,ruamel.yaml也没法凭空恢复。

内容的提问来源于stack exchange,提问作者thebenman

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 03:35:40