Удаление пары ключ-значение из словаря yaml в python - PullRequest
0 голосов
/ 19 октября 2019

Мы хотели бы удалить ключ и значения из файла YAML, используя python, например,

- 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

Из приведенного выше примера мы хотели бы удалить весь набор свойств и там, где имя ключа совпадаетзначение, например, если мы хотим удалить имя: 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

Ответы [ 2 ]

0 голосов
/ 19 октября 2019

Недостаточно удалить пару ключ-значение, чтобы получить желаемый результат.

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
0 голосов
/ 19 октября 2019

Вы пытались использовать модуль 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)
...