【问题标题】:How to use ruamel.yaml to dump literal scalars如何使用 ruamel.yaml 转储文字标量
【发布时间】:2018-06-14 08:16:56
【问题描述】:

我搜索并找到了“类似”的帖子,但没有任何内容可以直接回答我的问题。我还找到了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 以我想要的方式转储它?

【问题讨论】:

  • 另一个问题是关于折叠标量,你有一个文字块样式标量。折叠标量目前不像折叠标量那样往返,部分原因是更难以保留折叠位置的信息,还因为折叠标量很少使用(并且有用)。

标签: python ruamel.yaml


【解决方案1】:

您想要的不是折叠标量(应该有 > 而不是 |)而是 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.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 值和列表项)并转换字符串 多行文字标量

【讨论】:

  • 如果这解决了您的问题,请考虑将此答案标记为已接受(通过单击答案顶部左侧的“v”。然后其他人知道这对您有用,而无需阅读 cmets。
  • 现在应该使用LiteralScalarString 而不是PreservedScalarString - 3e6f42ae9af
猜你喜欢
  • 2021-10-11
  • 2018-12-02
  • 1970-01-01
  • 2012-03-27
  • 2019-03-27
  • 2023-03-21
  • 2021-01-10
  • 1970-01-01
  • 2023-03-22
相关资源
最近更新 更多