【问题标题】:Appending values of a key before spaces在空格前附加键的值
【发布时间】:2019-05-05 18:00:45
【问题描述】:

我正在使用 ruamel.yaml 插入一些值,但它将值附加在空格之后而不是空格之前。当前代码将值附加在行空间之后,如下面的 YAML 文件所示。标记为 ** NEW VALUE INSERTED HERE**

的 YAML 输出

prefix_state:

  v4:    
    8.8.8.8/32:
      description: GOOGLE_DNS
      enabled: true
      tags:
        - dns
      community:
        lb:
          - SELF_NO_EXPORT
          - TELCOM_NO_EXPORT
          - BUSINESS_NO_EXPORT

          **- <NEW VALUE INSERTED HERE>**
    10.10.1.0/24:
      description: SELF_LOCAL
      enabled: True
      tags:
        - local
      community:
        lb:
          - <NEW VALUE INSERTED HERE>

用于在 yaml 文件中附加值的代码如下:

yamldata=yaml.load(prefix_state_data,Loader=yaml.RoundTripLoader)
for arg in argv:
  if arg is None:
    pass
  else:
    for i in yamldata['prefix_state']['v4']:
      if yamldata['prefix_state']['v4'][i]['community']['lb'] is not None:
        yamldata['prefix_state']['v4'][i]['community']['lb'].append(arg+'_NO_EXPORT')
      else:
        yamldata['prefix_state']['v4'][i]['community']['lb']=[arg+'_NO_EXPORT']```

Expected end result is as below:

  v4:    
     8.8.8.8/32:
      description: GOOGLE_DNS
      enabled: true
      tags:
        - dns
      community:
        lb:
          - SELF_NO_EXPORT
          - TELECOM_NO_EXPORT
          - BUSINESS_NO_EXPORT
          **- <NEW VALUE INSERTED HERE>**

    10.10.1.0/24:
      description: SELF_LOCAL
      enabled: True
      tags:
        - local
      community:
        lb:
          - <NEW VALUE INSERTED HERE>

【问题讨论】:

  • 很难看出区别。
  • 如果您查看第一个 yml 文件。它在 BUSINESS_NO_EXPORT 之后显示一行,然后是新社区但我期望的是空白行之前的新值。

标签: python ruamel.yaml


【解决方案1】:

在 ruamel.yaml 中,cmets 和空行与元素相关联 在他们之前:如果他们遵循与他们关联的键值对 前面的键,如果它们遵循与它们关联的序列 他们跟随的元素的索引。

您似乎错误地认为您的“空”行是“之后” 序列,甚至可能在键 8.8.8.8/3210.10.1.0/24。 ruamel.yaml 没有这样的概念,也没有 StackOverflow 上的文档或答案使这种 声称 AFAIK (如果他们这样做,请指出你在哪里得到这个 错误信息)。


假设您有一个包含一个或多个注释的序列 行(空行被视为没有开始 # 的 cmets), 在特定索引之后(可能是最后一项的索引,如 你的情况),你可以做以下两件事之一:

  • 在包含评论的现有项目之后插入一个新项目,然后 移动评论(在最后一项之后插入与 附加)

  • 在其原始位置之前插入旧项目并覆盖 原来的旧项目,现在是一个索引,新的 物品。注释/空行现在将与

由于第二个选项更容易完成,我将在这里使用它

import sys
import ruamel.yaml

arg = 'XXX'

yaml_str = """\
prefix_state:
  v4:    
    8.8.8.8/32:
      description: GOOGLE_DNS
      enabled: true
      tags:
        - dns
      community:
        lb:
          - SELF_NO_EXPORT
          - TELCOM_NO_EXPORT
          - BUSINESS_NO_EXPORT

    10.10.1.0/24:
      description: SELF_LOCAL
      enabled: True
      tags:
        - local
      community:
        lb:
"""

yaml = ruamel.yaml.YAML()
yaml.indent(mapping=2, sequence=4, offset=2)
data = yaml.load(yaml_str)
yd = data['prefix_state']['v4']
for i in yd:
    if yd[i]['community']['lb'] is not None:
        lb = yd[i]['community']['lb']
        lb.insert(len(lb)-2, lb[len(lb)-1])
        lb[-1] = arg + '_NO_EXPORT'
    else:
        yd[i]['community']['lb'] = [arg + '_NO_EXPORT']
yaml.dump(data, sys.stdout)

给出:

prefix_state:
  v4:
    8.8.8.8/32:
      description: GOOGLE_DNS
      enabled: true
      tags:
        - dns
      community:
        lb:
          - SELF_NO_EXPORT
          - BUSINESS_NO_EXPORT
          - TELCOM_NO_EXPORT
          - XXX_NO_EXPORT

    10.10.1.0/24:
      description: SELF_LOCAL
      enabled: true
      tags:
        - local
      community:
        lb:
          - XXX_NO_EXPORT

请注意文件格式为YAML,包名ruamel.yaml, 并且 YAML 文件的推荐扩展名一直是 .yaml 2006. 但最重要的是YML 大约与 YAML 一样古老,但格式完全不同。

【讨论】:

  • 谢谢先生,这很完美,但是现在第二部分也有问题,这表明,lb 这里不是字典键,导致新社区在同一行中输入磅10.10.1.0/24: description: SELF_LOCAL enabled: true tags: - local community: lb: XXX_NO_EXPORT
  • 您似乎忘记了输入文件中lb 后面的值指示符 (:)。您还可以使用 if not isinstance(yd[i]['community'], dict): yd[i]['community'] = {yd[i]['community']: None} 测试键 commmunity 的值是否不是字典,然后将其设为字典
  • Nvm,想通了,在将文件转储到 yaml.compact(seq_seq=False, seq_map=False) yaml.default_flow_style=True 时输入了额外的代码
  • 您好,您能具体说明一下您使用的是哪个版本的 ruamel.yaml 吗?在当前版本中,您的方法不起作用,因为lb[len(lb)-1] 抛出错误,因为您无法按索引获取项目。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多