在空格前附加键的值
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/32
和
10.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 一样古老,但格式完全不同。
我正在使用 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/32
和
10.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 一样古老,但格式完全不同。