YAML 文件未加载嵌套值

YAML File not loading with nested values

我正在 python 使用 ruamel.yaml 编写 YAML 解析器 ruamel.yaml 的原因是它保留了关键的注释!

我知道问题是由 YAML 文件引起的,但我不确定如何解决这个问题,或者可能的修改是什么。我尝试了几种缩进方式,但都被删除了。

保持简单,传入源并尝试加载它。

代码:

import os
import os.path
import ruamel.yaml
from ruamel.yaml import YAML

def main():
    source = "my_yaml.yml"
    # Check if the source fil is valid yaml
    try:
        yaml = ruamel.yaml.YAML()
        with open(source) as fp:
            # data is the file data and will be used down the line
            data = yaml.load(fp)

        if data is None:
            data = {}
        return data
    except:
        print("Yaml file is not valid. Please check the source.")
        return 1

if __name__ == "__main__":
    out = main()

有效的 YAML:

d1: "key1"
d2: "key2"
d3: 
  d3_nest1: "key3"
  d3_nest2: "key4"

YAML 不起作用:

d1: "key1"
d2: "key2"
d3: 
  d3_nest1: "key3"
  d3_nest2: "key4"
  # this next item breaks my yaml
  - d3_nest3: "key6"
  d3_nest4: "key7"

YAML 的其他变体:

d1: "key1"
d2: "key2"
d3: 
    d3_nest1: "key4"
    d3_nest2: "key5"
# this next item breaks my yaml
- d3_nest3: "key6"
    d3_nest4: "key7"

d1: "key1"
d2: "key2"
d3: 
    d3_nest1: "key4"
    d3_nest2: "key5"
# this next item breaks my yaml
    - d3_nest3: "key6"
        d3_nest4: "key7"

这个: d3_nest2:key5 - d3_nest3: key6 d3_nest4: key7

是无效的 YAML,因为一旦开始块样式映射,每一行 在您更改缩进之前,必须采用 key: value 形式。

不清楚你想通过在映射中间提供一个序列元素来实现什么,就像你不能让 Python dict 只作为第二个元素的序列一样.也许您想要以下内容:

d1: "key1"
d2: "key2"
d3: 
  d3_nest1: "key3"
  d3_nest2:         # "key4" removed
  - d3_nest3: "key6"
  d3_nest4: "key7"

我建议你在 Python 中创建你想要的数据结构(使用嵌套的字典、列表和字符串值),假设你对此更熟悉,然后使用 ruamel.yaml 转储这样您就可以更好地了解什么是正确的 YAML 语法。

包含 YAML 文档的文件的推荐扩展名已经 .yaml 超过 15 年了。