我现在很困惑。我用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。
我该如何解决这个问题?在
出现了一些奇怪的情况,或者您没有使用代码示例来加载该文件,然后从
data
获取打印。如果您真的在使用yaml.load_all
,它将返回一个生成器对象,该对象允许您单步执行该文件中的1个或多个YAML文档。由于您没有使用document directive markers,因此使用load_all()
没有任何意义:给出: 开发 上例中的实际数据类型是
^{pr2}$ruamel.yaml.comments.CommentedMap
,这也是如果您做得更简单的话会得到的结果:它打印}。在
<class 'ruamel.yaml.comments.CommentedMap'>
(不是使用load()
而不是{CommentedMap
派生自ordereddict
因为对于往返(您使用的是
RoundTripLoader
)ruamel.yaml
需要保留顺序,并且有一个地方可以附加任何注释和其他信息来保存,这在使用dict
时是不可能的。ordereddict
是一个围绕ruamel.ordereddict
(如果可用)或OrderedDict
¹的便利类。在当然,您可以如上所述导入
ordereddict
并使用它,但如果您不需要往返或在字典中保留顺序(即,dict
很好),只需使用标准加载程序:印刷品:
我建议不要使用PyYAML来“降级”:它只实现YAML的旧1.1版本,尽管拉梅尔亚姆勒是PyYAML的一个衍生产品,自从它被派生出来以来,它已经解决了许多最初针对PyYAML²提出并仍然属于PyYAML²的问题。在
¹拉梅尔德迪克特是一个有序dict的(快速)C实现,在OrderedDict出现在标准库中之前已经存在了几年,因为标准库版本只有一小部分功能,而且直到python3.5是(慢)纯Python,我从来没有选择过使用OrderedDict。
²但是我有偏见,因为我是
ruamel.yaml
的作者(并且知道它需要更多的文档)。几乎可以肯定的是,您没有使用} 。在
pyyaml
,因为它没有RoundTripLoader
。相反,您可能正在使用^{这个替代方案在Python2安装上使用它自己的^{} ,在Python3上使用本机的
collections.OrderedDict
。这个替代方案支持OrderedDict执行的大多数操作,因此您没有理由不能操作它。请参阅其文档。在但是,如果您希望从一个转换到另一个,可以执行以下操作:
相关问题 更多 >
编程相关推荐