python ordereddict还是ordereddict?

2024-10-01 13:43:07 发布

您现在位置:Python中文网/ 问答频道 /正文

我现在很困惑。我用PyYAML编辑一些YAML文件。在

data = yaml.load_all(open('testingyaml.yaml'),Loader=yaml.RoundTripLoader)

我的测试yaml.yaml文件包含以下内容:

^{pr2}$

当我打印数据时,它会打印以下内容:

ordereddict([('spring', ordereddict([('profiles', 'dev'), ('datasource', ordereddict([('url', 'jdbc:postgresql://127.0.0.1:5432/nfvgrid')]))])), ('dns', ordereddict([('enable', False)])), ('cassandra', ordereddict([('host', '192.168.7.151')]))])

我还想对这个有序字典执行一些操作,但是python抛出一个错误NameError: name 'ordereddict' is not defined

它通常是OrderedDict,但PyYAML以某种方式返回ordereddict。 我该如何解决这个问题?在


Tags: 文件数据编辑yamldataloadloaderopen
2条回答

出现了一些奇怪的情况,或者您没有使用代码示例来加载该文件,然后从data获取打印。如果您真的在使用yaml.load_all,它将返回一个生成器对象,该对象允许您单步执行该文件中的1个或多个YAML文档。由于您没有使用document directive markers,因此使用load_all()没有任何意义:

from __future__ import print_function

import ruamel.yaml as yaml

datas = yaml.load_all(open('testingyaml.yaml'), Loader=yaml.RoundTripLoader)
print(datas, '\n', '-' * 50, sep='')
for data in datas:
    print(data['spring']['profiles'])
print(type(data))

给出: 开发 上例中的实际数据类型是ruamel.yaml.comments.CommentedMap,这也是如果您做得更简单的话会得到的结果:

^{pr2}$

它打印<class 'ruamel.yaml.comments.CommentedMap'>(不是使用load()而不是{}。在

CommentedMap派生自ordereddict

from ruamel.yaml.compat import ordereddict
from ruamel.yaml.comments import CommentedMap
assert issubclass(CommentedMap, ordereddict)

因为对于往返(您使用的是RoundTripLoaderruamel.yaml需要保留顺序,并且有一个地方可以附加任何注释和其他信息来保存,这在使用dict时是不可能的。ordereddict是一个围绕ruamel.ordereddict(如果可用)或OrderedDict¹的便利类。在

当然,您可以如上所述导入ordereddict并使用它,但如果您不需要往返或在字典中保留顺序(即,dict很好),只需使用标准加载程序:

data = yaml.load(open('testingyaml.yaml'))
print(type(data))

印刷品:

<type 'dict'>

我建议不要使用PyYAML来“降级”:它只实现YAML的旧1.1版本,尽管拉梅尔亚姆勒是PyYAML的一个衍生产品,自从它被派生出来以来,它已经解决了许多最初针对PyYAML²提出并仍然属于PyYAML²的问题。在


¹拉梅尔德迪克特是一个有序dict的(快速)C实现,在OrderedDict出现在标准库中之前已经存在了几年,因为标准库版本只有一小部分功能,而且直到python3.5是(慢)纯Python,我从来没有选择过使用OrderedDict。
²但是我有偏见,因为我是ruamel.yaml的作者(并且知道它需要更多的文档)。

几乎可以肯定的是,您没有使用pyyaml,因为它没有RoundTripLoader。相反,您可能正在使用^{}。在

这个替代方案在Python2安装上使用它自己的^{},在Python3上使用本机的collections.OrderedDict。这个替代方案支持OrderedDict执行的大多数操作,因此您没有理由不能操作它。请参阅其文档。在

但是,如果您希望从一个转换到另一个,可以执行以下操作:

x = collections.OrderedDict(some_ruamel_ordered_dict.items())

相关问题 更多 >