YAML python数组对象ord

2024-06-10 18:35:08 发布

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

我在想办法维持山药的秩序?当我重读字典时,我的顺序是错的。在

from yaml import load

def __init__(self, logger, configFilePath):
    self.config_dict = None

    with open(configFilePath) as config:
        self.config_dict = load(config)

    logger.debug('values:')  
    for key, value in self.config_dict.iteritems():
        logger.debug('- ' + key + ': ' + str(value))

    logger.debug('+++ Successfully finished +++')

def getConfig(self):
    return self.config_dict    

Yaml示例

^{pr2}$

这是一个我如何调用这个类的例子。没什么特别的。简而言之,我不是先得到东西,而是先得到东西。。。在

yamlObj = parser.config_parser(logger, theFile)
myYaml = yamlObj.getConfig()
for image in myYaml["repos.images"]:
    myStr = image["foo"] + '/' + image["id"]
    logger.debug("myStr is: " + myStr)

有什么方法可以做到这一点,还是有更好的方法来组织我的山药?在


Tags: keyindebugimageselfconfigforvalue
3条回答

您可以使用namedtuple来控制加载的配置。另外,考虑使用safe_load

import collections
import yaml


file = open("./so.yaml", 'r')
cfg = yaml.safe_load(file)

Config = collections.namedtuple("Config", ["id", "foo", "name"])

cfg_lst = [Config(**x) for x in cfg["repos.images"]]

然后,举例来说

^{pr2}$

会给你

>>> [Config(id='Thing1', foo='bar', name='Sam'), Config(id='thing2', foo='bar', name='dan')]

所以,要访问一个特定的元素,比如,thing2,您可以这样处理它

>>> print(cfg_lst[1].id)
>>> thing2

我最近为此写了一个库,^{}。在壳牌公司:

$ pip install oyaml

在Python代码中,这是一个字符的更改:

^{pr2}$

然后映射将被加载到^{}实例中,而不是常规dict中,保留它们在配置文件中的原始顺序。在

字典(或散列、键/值、关联数组、映射,可以随意调用)通常是显式无序的。如果您真的想维护订单,您可以使用不同的yaml库来实现这一点(在工作中,我们使用https://pypi.python.org/pypi/ruamel.yaml对yaml文件进行“就地”更新)。在

但是一旦数据从YaML中取出,一定要使用有序字典(python3)或其他解决方案。在

相关问题 更多 >