簡體   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