在空格前附加键的值

时间:2019-05-05 18:00:46

标签: python ruamel.yaml

我正在使用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>

1 个答案:

答案 0 :(得分:0)

在ruamel.yaml中,注释和空行与元素相关联 :如果它们遵循键值对,则它们与 前一个键,如果它们遵循与它们关联的序列 他们遵循的元素的索引。

您似乎误认为您的“空”行是在“之后” 顺序,甚至在键8.8.8.8/3210.10.1.0/24。 ruamel.yaml没有这种概念,也没有 文档或StackOverflow上的答案使这种 声称拥有AFAIK(如果确实如此,请指出您到达此位置的位置 错误信息。


假设您有一个带有一个或多个注释的序列 行(空行被认为是没有开头#的注释), 在特定索引之后(可能是最后一项的索引,例如 您的案例),您可以执行以下两项操作之一:

  • 在具有注释的现有项目之后插入一个新项目,并 移动评论(在最后一项之后插入与 附加)

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

  • 关联

由于第二个选项更容易实现,因此我将在这里使用

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一样古老,但格式完全不同。