我正在使用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>
答案 0 :(得分:0)
在ruamel.yaml中,注释和空行与元素相关联 :如果它们遵循键值对,则它们与 前一个键,如果它们遵循与它们关联的序列 他们遵循的元素的索引。
您似乎误认为您的“空”行是在“之后”
顺序,甚至在键8.8.8.8/32
和
10.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一样古老,但格式完全不同。