在Python中从yaml文件动态生成数组元素

时间:2018-08-14 01:06:59

标签: python python-3.x yaml

给出以下存储在 my_yaml 中的yaml文件,其中包含不同的字典键和/或类变量集(以self ._ *表示):

config1.json:
- [[foo, bar], [hello, world]]
config2.json:
- [[foo], [self._hi]]

我要从json文件填充一个新的元组列表。每个元组中的项目都是通过在此yaml文件中查找字典键来确定的。

因此,如果我遍历名为 config1.json 的字典,并且有一个名为 config_list 的空列表,则我想执行以下操作:

config_list.append(tuple[i['foo']['bar],i['hello']['world']])

但是如果它是 config2.json ,我想执行以下操作:

config_list.append(tuple[i['foo'],self._hi])

我可以用不太动态的方式做到这一点:

for i in my_yaml['config1.json'][0]:
    config_list.append(tuple([ i[my_yaml[asset][0][0]][my_yaml[asset][0][1]],i[my_yaml[asset][1][0]][my_yaml[asset][1][1]]]))

或:

for i in my_yaml['config2.json'][0]:
    config_list.append(tuple([ i[my_yaml[asset][0][0]],i[my_yaml[asset][1][0]]]))

相反,我想动态生成 config_list

的内容

任何想法或替代方案都将不胜感激。

1 个答案:

答案 0 :(得分:0)

我认为您有点困惑,首先是因为您指的是 到“来自json [ sic ]文件”中的文件中,没有提到JSON文件 问题中的任何地方。有映射键看起来像 JSON文件的文件名,因此我希望我们可以假设您的意思是“来自值 与以字符串.json“结尾的映射键关联。

另一个令人困惑的事情是,您混淆了想要元组的事实 但要加载嵌套在YAML文档中列表中的列表中的嵌套列表。 如果需要元组,则在YAML文档中指定元组会更加清楚:

config1.json:
- !!python/tuple [[foo, bar], [hello, world]]
config2.json:
- !!python/tuple [[foo], [self._hi]]

因此您可以这样做:

import sys
import ruamel.yaml


yaml = ruamel.yaml.YAML(typ='unsafe')
with open('my.yaml') as fp:
    my_yaml = yaml.load(fp)

for key in my_yaml:
    for idx, elem in enumerate(my_yaml[key]):
        print('{}[{}] -> {}'.format(key, idx, my_yaml[key][idx]))

直接为您提供您似乎想要的元组,而不是您需要处理的列表:

config1.json[0] -> (['foo', 'bar'], ['hello', 'world'])
config2.json[0] -> (['foo'], ['self._hi'])

在您的问题中,您对第一个也是唯一一个进行了硬编码访问 序列的元素,是根级别的值 映射。这迫使您在for循环中使用最后的[0]。一世 假设您将在这些序列中包含多个元素,但是 对于一个很好的问题,您应该将其排除在外,因为这与 有关如何获取元组,从而仅使事物混淆的问题。

请注意,您需要对输入进行控制,例如使用 您猜想typ='unsafe'是不安全的。如果您不能保证 使用typ='safe'并注册并使用标签!tuple