繁体   English   中英

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

[英]How to use ruamel.yaml to dump literal scalars

我搜索并找到了“类似”的帖子,但没有直接回答我的问题。 我还在这里找到了一个stackoverflow 帖子,但没有答案。

我需要使用以下格式写入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 以我想要的方式转储它?

您想要的不是折叠标量(它将具有>而不是| ),而是块样式文字标量

解决这个问题的一般方法是查看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.LiteralScalarString'>

有了这些知识,您可以:

from ruamel.yaml.scalarstring import LiteralScalarString

data['data_points'] = literalScalarString("""\
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 多行字符串也不应该有一个。

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

遍历一个简单的 yaml 树(在 dict 值和列表项中递归)并将具有多行的字符串转换为文字标量

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM