如何使用ruamel.yaml转储文字标量

时间:2018-06-14 08:16:56

标签: python ruamel.yaml

我搜索过并发现了“类似”帖子,但没有任何内容直接回答我的问题。我还找到了stackoverflow post here,但没有答案。

我需要使用以下格式写入yaml文件:

any_value: 123.4
data_points: |-
  0.0, 1.0
  0.1, 1.5
  0.2, 1.7

如果我使用包含\n的长字符串,它只会按原样打印:

any_value: 123.4
data_points: "0.0, 1.0\n0.1, 1.5\n0.2, 1.7"

这不是我想要的。我也可以将它作为列表传递给每个项目看起来像这个

['0.0, 1.0', '0.1, 1.5', '0.2, 1.7']

但这只会导致

any_value: 123.4
data_points:
- 0.0, 1.0
- 0.1, 1.5
- 0.2, 1.7

它有点像第一个,但事实并非如此。如何让ruamel.yaml以我想要的方式转储它?

1 个答案:

答案 0 :(得分:5)

你想要的不是折叠标量(>而不是|)而是block style literal scalars

解决此问题的一般方法是查看ruamel.yaml是否可以往返您想要的内容:

import sys
import ruamel.yaml

yaml_str = """\
any_value: 123.4
data_points: |-
  a
  b
"""

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

这给出了:

any_value: 123.4
data_points: |-
  a
  b

由于输出看起来像输入,请检查ruamel.yaml用于保留文字样式信息的类型:

print(type(data['data_points']))

显示ruamel.yaml使用的内容:

<class 'ruamel.yaml.scalarstring.PreservedScalarString'>

凭借这些知识,你可以做到:

from ruamel.yaml.scalarstring import PreservedScalarString

data['data_points'] = PreservedScalarString("""\
0.0, 1.0
0.1, 1.5
0.2, 1.7""")

yaml.dump(data, sys.stdout)

导致:

any_value: 123.4
data_points: |-
  0.0, 1.0
  0.1, 1.5
  0.2, 1.7

请注意,|-中的短划线表示您的标量没有最终换行符。这就是为什么你的Python多行字符串也不应该有一个。

walk_tree()中还有一个功能ruamel/yaml/scalarstring.py,它可能有所帮助,它:

  

走过一棵简单的yaml树(递归       dict值和列表项)并转换字符串       有多行到文字标量