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

