Как вызвать и перебрать значения из файла yaml, проанализированного с помощью python? - PullRequest
0 голосов
/ 07 октября 2018
  1. У меня есть файл yaml, как показано ниже:

    server1:
      host: os1
      ip: ##.###.#.##
      path: /var/log/syslog
      file: syslog
      identityfile: /identityfile/keypair.pub
    
    server2:
      host: os2
      ip: ##.###.#.##
      path: /var/log/syslog
      file: syslog.1
      identityfile: /identityfile/id_rsa.pub
    

У меня есть фрагмент кода для анализа yaml и чтения записей.

чтение данных из файла конфигурации yaml

    def read_yaml(file):
        with open(file, "r") as stream:
    try:
        config = yaml.load(stream)
        print(config)
    except yaml.YAMLError as exc:
        print(exc)
        print("\n")
return config

read_yaml ("config_file") print (config)

Мои проблемы: 1. Я не могу вернуть значения и получаю "NameError: имя 'config' не определено "в операторе печати, вызываемом вне функции.

Как я могу перебирать и читать значения в моем файле yaml, передавая только параметры?Пример: print ('{host} @ {ip}: {path}'. Format (** config ['os1'])), но без 'os1', поскольку в файле yaml может быть 100s записей

Я гарантировал, что с помощью наборов нет дубликатов, но хочу использовать цикл и сохранить значения из моей команды форматирования строки в переменную без использования 'os1' или 'os2' или 'os #'.

def iterate_yaml():
remotesys = set()

for key,val in config.items():
    print("{} = {}".format(key,val))


#check to ensure duplicates are removed by storing it in a set

remotesys.add('{host}@{ip}:{path}'.format(**config['os1']))
remotesys.add('{host}@{ip}:{path}'.format(**config['os2']))
remotesys.add('{host}@{ip}:{path}'.format(**config['os3']))

Спасибо за помощь.

1 Ответ

0 голосов
/ 07 октября 2018
  1. Вы получаете исключение NameError, потому что вы не возвращаете никаких значений.Вы должны вернуть config из функции.

Например:

def read_yaml(...):
    # code

     return config

Затем, позвонив read_yaml, вы вернете свою конфигурацию.

Проверьте документацию Python и руководства для этого.

2-3.Вы можете выполнить цикл for, используя метод dict.items.

Например:

x = {'lol': 1, 'kek': 2}

for name, value in x.items():
    print(name, value)
...