Мне нужна функция, которая позволит установить вложенное значение в файле YAML. Например, для YAML вроде:

  • 1-Й УРОВЕНЬ:
    • УРОВЕНЬ_2:
      • УРОВЕНЬ_3: некоторое_значение

Я бы сделал что-то вроде: update_yaml_value ("LEVEL_1.LEVEL_2.LEVEL_3", "new_value")

Буду признателен за любую помощь. Заранее спасибо.

1
Bartek Gmerek 7 Окт 2020 в 12:58

3 ответа

Лучший ответ

Прежде всего вам нужно импортировать yaml:

import yaml

Когда вы загружаете какой-нибудь файл yaml, вы получите объект python dict.

with open('/path/to/smth.yaml', 'r') as f:
    yaml_data = yaml.safe_load(f)

Чтобы иметь возможность изменить его так, как вы описали, вы можете создать функцию, подобную следующей:

def update_yaml_value(long_key, data):
    keys = long_key.split('.')
    accessable = yaml_data
    for k in keys[:-1]:
        accessable = accessable[k]
    accessable[keys[-1]] = data

А затем сохраните этот yaml-файл:

with open('/path/to/smth.yaml', 'w+') as f:
    yaml.dump(yaml_data, f, default_flow_style=False)
1
SimfikDuke 7 Окт 2020 в 10:08

Вы можете использовать эту функцию для быстрого изменения значения dict.

Test.py :

#!/usr/bin/env python3

import yaml


def change_config(conf, key, value):
    if isinstance(conf, dict):
        for k, v in conf.items():
            if k == key:
                conf[k] = value
            elif isinstance(v, dict):
                change_config(v, key, value)


with open("smth.yaml", "r") as f:
    yaml_data = yaml.load(f, Loader=yaml.Loader)
    print(yaml_data)
    change_config(yaml_data, "level3", "hassan")
    print(yaml_data)

Smth.yaml:

level0:
  level1:
    level3: test

Выходной терминал:

{'level0': {'level1': {'level3': 'test'}}}
{'level0': {'level1': {'level3': 'hassan'}}}
0
pouralijan 7 Окт 2020 в 10:32

Ваш код Python загрузит YAML в дикт.

С помощью dict вы сможете обновить значение.

a_dict = load_yaml() # to be implemented by the OP
a_dict['level_1']['level_2']['level_3'] = 'a_new_value'
0
balderman 7 Окт 2020 в 10:02