在python中从yaml字典中删除键值对
例如,我们希望使用python从YAML文件中删除键和值在python中从yaml字典中删除键值对,python,yaml,ruamel.yaml,Python,Yaml,Ruamel.yaml,例如,我们希望使用python从YAML文件中删除键和值 - misc_props: - attribute: tmp-1 value: 1 - attribute: tmp-2 value: 604800 - attribute: tmp-3 value: 100 - attribute: tmp-4 value: 1209600 name: temp_key1 attr-1: 20 attr-2: 1 - misc_props:
- misc_props:
- attribute: tmp-1
value: 1
- attribute: tmp-2
value: 604800
- attribute: tmp-3
value: 100
- attribute: tmp-4
value: 1209600
name: temp_key1
attr-1: 20
attr-2: 1
- misc_props:
- attribute: tmp-1
value: 1
- attribute: tmp-2
value: 604800
- attribute: tmp-3
value: 100
- attribute: tmp-4
value: 1209600
name: temp_key2
atrr-1: 20
attr-2: 1
从上面的示例中,我们希望删除全部属性,其中key name与值匹配,例如,如果我们要删除name:temp_key2,则删除后新创建的字典如下所示:-
- misc_props:
- attribute: tmp-1
value: 1
- attribute: tmp-2
value: 604800
- attribute: tmp-3
value: 100
- attribute: tmp-4
value: 1209600
name: temp_key1
attr-1: 20
attr-2: 1
您是否尝试过使用yaml模块
import yaml
with open('./old.yaml') as file:
old_yaml = yaml.full_load(file)
#This is the part of the code which filters out the undesired keys
new_yaml = filter(lambda x: x['name']!='temp_key2', old_yaml)
with open('./new.yaml', 'w') as file:
documents = yaml.dump(new_yaml, file)
仅删除键值对以获得所需输出是不够的
import sys
import ruamel.yaml
yaml = ruamel.yaml.YAML()
with open('input.yaml') as fp:
data = yaml.load(fp)
del data[1]['misc_props']
yaml.dump(data, sys.stdout)
因此:
- misc_props:
- attribute: tmp-1
value: 1
- attribute: tmp-2
value: 604800
- attribute: tmp-3
value: 100
- attribute: tmp-4
value: 1209600
name: temp_key1
attr-1: 20
attr-2: 1
- name: temp_key2
atrr-1: 20
attr-2: 1
您需要做的是删除以下序列中的一项:
YAML结构的根:
del data[1]
yaml.dump(data, sys.stdout)
其中:
- misc_props:
- attribute: tmp-1
value: 1
- attribute: tmp-2
value: 604800
- attribute: tmp-3
value: 100
- attribute: tmp-4
value: 1209600
name: temp_key1
attr-1: 20
attr-2: 1
yaml模块仅部分支持加载yaml 1.1。YAML 1.2已有十多年的历史。您的代码还将删除YAML文件中的所有注释,并使文件中的任何unicode都作为escape COE写入。当您向已经在使用ruamel.yaml的人推荐PyYAML时,您应该明确进行降级的所有问题和缺点。你真的运行了你的代码吗?如果你想,你会看到你得到的输出开始与
!!python/object/apply:builtins.filter
,不是OP所期望的。请包含发布时的代码,即使它没有完全按照预期工作(或根本没有),您也可以获得关于代码为什么不工作和/或无效假设是什么的宝贵反馈。