从 0.15.61 开始,可以在 ruamel.yaml 中往返折叠标量:
import sys
import ruamel.yaml
yaml_str = """\
long: >
Line1
Line2
Line3
"""
yaml = ruamel.yaml.YAML()
data = yaml.load(yaml_str)
print(type(data['long']), data['long'].fold_pos, end='\n-----\n')
yaml.dump(data, sys.stdout)
这使:
<class 'ruamel.yaml.scalarstring.FoldedScalarString'> [5, 11]
-----
long: >
Line1
Line2
Line3
该类型的打印仅用于显示您如何建立
如果从头开始工作,您自己要创建什么对象:
from ruamel.yaml.scalarstring import FoldedScalarString as folded
s = folded('Line1 Line2 Line3\n')
data = dict(long=s)
yaml.dump(data, sys.stdout)
它给出了一个折叠标量,但可能不是您想要的方式:
long: >
Line1 Line2 Line3
要使其折叠,您必须提供.fold_pos
属性。那
属性必须是一个列表(或一些可逆迭代)的位置
字符串中的空格字符,需要插入折叠的地方:
s = folded('Line1 Line2 Line3\n')
s.fold_pos = [5, 11]
data = dict(long=s)
yaml.dump(data, sys.stdout)
它返回您期望的输出:
long: >
Line1
Line2
Line3
由于您似乎希望折叠所有空间,因此您还可以执行以下操作:
import re
s.fold_pos = [x.start() for x in re.finditer(' ', s)]