Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在python中从yaml字典中删除键值对_Python_Yaml_Ruamel.yaml - Fatal编程技术网

在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:

例如,我们希望使用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:
  - 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所期望的。请包含发布时的代码,即使它没有完全按照预期工作(或根本没有),您也可以获得关于代码为什么不工作和/或无效假设是什么的宝贵反馈。