【问题标题】:How to convert ruamel.yaml to dict with Python3?如何使用 Python3 将 ruamel.yaml 转换为 dict?
【发布时间】:2023-03-22 23:14:01
【问题描述】:

我想要来自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'

【问题讨论】:

    标签: python python-3.x ruamel.yaml


    【解决方案1】:

    我用这个例子试过了,

    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))) 的错误

    如果您不必往返,也可以使用安全加载器:

    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,而不是更复杂的往返类型。

    【讨论】:

    • 原来我的问题是由于在超类上定义的属性并在包含我显示的代码的子类中重新定义。我发布的代码删除了所有自我引用。属性的设置器代码对数据做坏事。无论如何,你的答案是正确的,所以我把这个给你。谢谢!
    • 我添加了一个不需要转换的示例,并将文件扩展名更新为.yaml,因为这是自 2006 年 9 月以来推荐的扩展名
    • @Anthon,感谢您的回复。文档(我相信你写的)没有定义“往返”,但我想这意味着加载/反序列化/重新序列化/保存回磁盘。我的用例实际上是加载和保存任何更改。我不知道 load 接受了一个路径,这简化了所需的代码。你提到了一个安全的加载器,但这并不意味着加载调用不同,这意味着构造函数不同,对吗?储蓄会是什么样子?我的代码使用了with open,但也许路径又是可能的?
    • @MikeSlinn 我将在文档中更正式地定义往返,感谢您指出这一点。我认为它是加载-修改-保存,同时保留大部分。纯安全模式将丢弃 cmets 等,但也会将项目转换为 dict()(不一定用于未转换的嵌套字典)。您可以将 Pathyaml.dump() 一起使用打开文件为你写。
    猜你喜欢
    • 2020-06-16
    • 2017-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-22
    • 2013-12-24
    • 2020-02-13
    相关资源
    最近更新 更多