【问题标题】:How do I configure multiple dictionary keys in a yaml file in Python?如何在 Python 的 yaml 文件中配置多个字典键?
【发布时间】:2018-08-10 15:39:29
【问题描述】:

我正在尝试使用 yaml 文件来存储字典键,以便解析各种 json 有效负载。

我将以下 yaml 文件加载到名为“cfg”的变量中:

my_table: metadata

当我跑步时:

for i in json['resources']:
    print(i[cfg['my_table']])

我可以从我的 json 的 ['metadata'] 键中查看所有值。

但是,我希望查看 ['resources'] 下存在的 ['metadata']['guid'] 键的所有值。因此,当我将 yaml 文件更改为:

my_table: metadata, guid

它不起作用。我也尝试过这些变体:

my_table: ['metadata', 'guid']  #tried ''.join("['{0}']".format(a) for a in cfg['my_table']) which gives me what I want, but when I shove this inside i[], I get a key error
my_table: ['metadata']['guid']  #yaml file doesn't parse properly

有什么想法吗?

【问题讨论】:

  • 好吧,如果您尝试映射 yaml 属性,那么值的结构应该是 python 可以理解的结构。试试my_table: [metadata, guid]
  • 我们能看到你的 json 的一个例外吗? guid 是 metadata 对象的键还是 resources 对象中的单独键?
  • 您需要i['metadata']['guid'],这是对i 和i['metadata'] 的两个单独的索引操作,而不是您可以在一个表达式中捕获的单个索引操作。也就是说,没有x 对应的i[x] is i['metadata']['guid']。

标签: python yaml pyyaml


【解决方案1】:

所以您想将字典键存储在 yaml 文件中?

做事

# keys.yaml
my_table: [metadata, guid]

然后在你的python文件中

keys = yaml.safe_load('keys.yaml')['my_table']

for obj in json['resources']:  # don't call it json, that's a package name
    print(obj[keys[0]][keys[1]])

对于可变数量的键(不仅仅是两个)这样做:

def recursive_getitem(obj, keys):
   if len(keys) == 0:
      return obj
   return recursive_getitem(obj[keys[0]], keys[1:])

然后做

for obj in json['resources']:  
    print(recursive_getitem(obj, keys))

要回答您在 cmets 中的第二个问题,您需要使用嵌套列表

# keys.yaml
my_table:
    - [metadata, guid]
    - [entity, name]

.

# py file
keys = yaml.safe_load('keys.yaml')['my_table']

for obj in json['resources']:  # don't call it json, that's a package name
    print(obj[keys[0][0]][keys[0][1]])
    print(obj[keys[1][0]][keys[1][1]])

【讨论】:

  • 由于 OP 使用 PyYAML,根据 PyYAML 文档,使用 yaml.load() 是不安全的。这里也完全没有必要,yaml.safe_load() 可以。
  • 很公平,我对 yaml 不是很有经验,所以我会编辑。
  • 是的,这对我有用!我现在可以在我的 yaml 文件中放置:[元数据,guid]。无论如何,我将如何获得 ['metadata']['guid'],然后再获得像 ['entity']['name'] 这样的另一对。如果我将 [[metadata, guid], [entity,name]] 放在我的 yaml 文件中,它将无法正确加载。也就是说,你回答了我原来的问题,所以我会接受答案。
  • 谢谢@FHTMitchell - 是否有一个递归函数,不仅可以用于每个列表中的项目,还可以用于列表的数量?
猜你喜欢
  • 2020-02-02
  • 1970-01-01
  • 2018-07-28
  • 2018-09-27
  • 1970-01-01
  • 2018-05-19
  • 1970-01-01
  • 2018-07-17
  • 2021-11-17
相关资源
最近更新 更多