在空格前附加键的值

Appending values of a key before spaces

我正在使用 ruamel.yaml 插入一些值,但它将值附加在 space 之后而不是 space 之前。当前代码在 space 行之后附加值,如下面的 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>

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

您似乎误以为您的 "empty" 行是 "after" 顺序,甚至可能在键 8.8.8.8/3210.10.1.0/24。 ruamel.yaml 没有这样的概念,none Whosebug 上的文档或答案 claim AFAIK(如果他们这样做,请指出你从哪里得到这个 错误信息)。


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

  • 在已有评论的现有项目之后插入一个新项目,并且 移动评论(在最后一项之后插入与 追加)

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

  • 相关联

由于第二个选项更容易实现,我将在此处使用它

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