Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用Python3将ruamel.yaml转换为dict?_Python_Python 3.x_Ruamel.yaml - Fatal编程技术网

如何使用Python3将ruamel.yaml转换为dict?

如何使用Python3将ruamel.yaml转换为dict?,python,python-3.x,ruamel.yaml,Python,Python 3.x,Ruamel.yaml,我想要一个来自ruamel.yaml的dict(或orderedict)。 我正在使用Python3.8,如果有帮助的话,我很乐意切换到3.9 从ruamel.yaml导入yaml 从集合导入订单 将open(self.filename)作为f: 数据=yaml.荷载(f) 打印(类型(数据))# 数据=dict(yaml.荷载(f)) 打印(类型(数据))# data=yaml.load(f.items()#AttributeError:'NoneType'对象没有属性“items” 我用这个

我想要一个来自
ruamel.yaml
dict
(或
orderedict
)。 我正在使用Python3.8,如果有帮助的话,我很乐意切换到3.9

从ruamel.yaml导入yaml
从集合导入订单
将open(self.filename)作为f:
数据=yaml.荷载(f)
打印(类型(数据))#
数据=dict(yaml.荷载(f))
打印(类型(数据))#
data=yaml.load(f.items()#AttributeError:'NoneType'对象没有属性“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 

这将加载所有映射为
dict
s,序列为
list
s,而不是更复杂的往返类型。

结果表明,我的问题是由于在超类上定义了一个属性,并在包含我显示的代码的子类中重新定义了该属性。我发布的代码删除了所有的自引用。属性的setter代码对数据做了不好的事情。无论如何,你的答案是正确的,所以我给你这个。谢谢我添加了一个不需要转换的示例,并将文件扩展名更新为
.yaml
因为自Sep以来,推荐使用此扩展名2006@Anthon,谢谢你的回复。文档(我相信是您写的)没有定义“往返”,但我想这意味着加载/反序列化/重新序列化/保存回磁盘。我的用例实际上是加载和保存任何更改。我不知道load接受了一条路径,这简化了所需的代码。您提到了安全加载程序,但这并不意味着加载调用不同,而是意味着构造函数不同,对吗?储蓄会是什么样子?我的代码使用了开放的
但可能再次有一条路径?@mikeslin我将更正式地在文档中定义往返,谢谢您指出这一点。我将其视为加载-修改-保存,同时保留大部分。纯安全模式将丢弃注释等,但对于项强制转换,强制转换为
dict()
(对于未转换的嵌套dict,不一定如此)。。您可以将
路径
yaml.dump()
一起使用,它将打开文件供您编写。
from pathlib import Path
from ruamel.yaml import YAML

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