如何将 ruamel.yaml 转换为带有 Python3 的字典?

How to convert ruamel.yaml to dict with Python3?

我想要 ruamel.yamldict(或 OrderedDict)。 我正在使用 Python 3.8,如果有帮助,我很乐意切换到 3.9。

from ruamel.yaml import YAML
from collections import OrderedDict

with open(self.filename) as f:
    data = yaml.load(f)
    print(type(data))  # <class 'ruamel.yaml.comments.CommentedMapItemsView'>

    data = dict(yaml.load(f))
    print(type(data))  # <class 'dict_items'>

    data = yaml.load(f).items()  # AttributeError: 'NoneType' object has no attribute 'items'

我用这个例子试过了,

from ruamel.yaml import YAML

with open("test.yaml") as f:
    yaml = YAML()
    data = yaml.load(f)
    print(type(data))
    print("all: ", data)
    print(dict(data)) 
    print(dict(data)['data']) 

test.yaml

---
data: name
test1:
  - name: name1

输出

<class 'ruamel.yaml.comments.CommentedMap'>
all:  ordereddict([('data', 'name'), ('test1', [ordereddict([('name', 'name1')])])])
{'data': 'name', 'test1': [ordereddict([('name', 'name1')])]}
name 

您需要在使用之前将 YAML 加载到变量中,因此您需要使用 data 而不是 yaml.load(f)。 它显示 print(dict(yaml.load(f)))

的错误

如果您不必 round-trip,或者您可以使用安全加载程序:

from pathlib import Path
from ruamel.yaml import YAML

yaml = YAML(typ='safe', pure=True)
data = yaml.load(Path('test.yaml'))
print(type(data))

这会将所有映射加载为 dicts 并将序列加载为 lists 而不是 round-tripping 的更复杂类型。