【问题标题】:How to read Dynamically updating YAML with python如何阅读使用 python 动态更新 YAML
【发布时间】:2017-09-11 16:35:46
【问题描述】:

我有 yaml 文件,看起来像这样。

---
env:
  credentials:
    endpoint: "value"
    username: "value"
    tenant: "value"
    password: "value"

  ld_a:
    network:
        subnet-name:
            - sub1
        ld_filename:
            - ld1.xml
        fd_filename:
            - fd1.xml
            - fd2.xml

  ld_b:
    network:
        subnet-name:
            - sub2
        ld_filename:
            - ld2.xml
        fd_filename:
            - fd1.xml
            - fd2.xml

在任何时候,用户都可以使用ld_c 或后续标签更新 YAML,或者删除任何标签。

到目前为止,我正在检查 dict 中的 ld_a 并处理嵌套的键、值(如下所示)。

with open(r'C:\file.yaml', 'r') as fd:
    data = yaml.load(fd)

items = data.get('env')
for descriptor, value in items.iteritems():
    if descriptor == 'credentials':
        tenant = value.get('tenant')
        username = value.get('username')
        password = value.get('password')
        endpoint = value.get('endpoint')


    if descriptor == 'ld_a':
        for descriptor in value.viewvalues():
            for user_networks in descriptor.get('subnet-name'):
                get_network_details(neutron, user_networks)

但是当用户添加/删除键时,例如 ld_c 。我们应该如何在python中处理这个。

【问题讨论】:

  • 听起来您是在说用户可以通过修改运行程序的文件系统中 file.yaml 的内容来添加/删除密钥。如果用户不能在每次修改文件时重新运行程序是有原因的,那么您可能需要澄清您的假设/要求。
  • 我不明白。您可以每隔一段时间重新加载文件并检查新的keys(例如ld_c)并查看是否有东西可以对其执行操作。我的意思是你只需要在你的代码中添加越来越多的if 语句!
  • 另外你说subsequent tags是什么意思??你的意思是ld_cld_dld_e等等?
  • @Peter:抱歉。 .我认为我的解释并不准确。让我改写一下。!要求是用户可以在 YAML 中添加/删除标签ld_c 等等.. 并执行代码。但是我的问题是我应该如何知道哪个关键用户输入了。
  • @TechJS : 是的.. 它的ld_c 等等.. 让我试试你发布的答案。!

标签: python python-2.7 dictionary yaml


【解决方案1】:

根据我的基本知识,这里是你的答案:

import re

pattern = re.compile(r"ld_[a-z]")

if pattern.match(descriptor):
    for descriptor in value.viewvalues():
        for user_networks in descriptor.get('subnet-name'):
            get_network_details(neutron, user_networks)

基本上,您是在 descriptor 上执行正则表达式,它匹配每个 ld_ 字符,后跟一个字符,即 a 到 z(a、b、c ... 等)

【讨论】:

    猜你喜欢
    • 2016-09-26
    • 2015-04-17
    • 2020-12-16
    • 2018-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-19
    相关资源
    最近更新 更多