Чтение значений из объекта python, загруженного из файла yaml - PullRequest
0 голосов
/ 04 октября 2018

У меня есть скрипт, который читает файл YAML в словарь Python.Как прочитать значения и объединить некоторые из них, чтобы они были более значимыми?

#script to load the yaml file into a python object
import yaml
from yaml import load, dump
#read data from the config yaml file
with open("config.yaml", "r") as stream:
    try:
        print(yaml.load(stream))
    except yaml.YAMLError as exc:
        print(exc)

Содержимое файла YAML:

os2:
  host:hostname
  ip:10.123.3.182
  path:/var/log/syslog
  file:syslog

Ответы [ 3 ]

0 голосов
/ 04 октября 2018

Ваш файл yaml неправильно настроен.Между каждым ключом и его значением должен быть пробел.У вас должно быть что-то вроде:

os2:
  host: hostname
  ip: 10.123.3.182
  path: /var/log/syslog
  file: syslog

yaml.load вернет словарь, значения которого вы можете получить в обычном режиме.

{'os2': {'host': 'hostname', 'ip': '10.123.3.182', 'path': '/var/log/syslog', 'file': 'syslog'}}

Ваш код будет выглядеть так

#script to load the yaml file into a python object
import yaml
from yaml import load, dump
#read data from the config yaml file
with open("config.yaml", "r") as stream:
    try:
        config = yaml.load(stream)
        #concatenate into string
        string = f"{config['os2']['host']}@{config['os2']['ip']}:{config['os2']['path']}"
    except yaml.YAMLError as exc:
        print(exc)
0 голосов
/ 07 октября 2018

Ваш YAML совершенно нормальный, и он загружается, как вы можете видеть здесь .

У вас есть один ключ (os2) и, как значение, многострочный простой скаляр, который загружает,следуя стандарту YAML, в виде строки с пробелом, где YAML имеет символы новой строки + пробелы.Это значение, таким образом, загружается как "host:hostname ip:10.123.3.182 path:/var/log/syslog file:syslog".

Поскольку вы указываете, что ожидаете значения (кратные), вы должны либо ввести значение для os2 отображение в стиле потока (в этом случае вы должны заключить в кавычки скаляры, в противном случаеВы можете, например, не писать простые URL-адреса как скаляры в действительном YAML):

os2: {
  "host":"hostname",
  "ip":"10.123.3.182",
  "path":"/var/log/syslog",
  "file":"syslog"
  }

или вам следует следовать руководству из стандарта YAML , что

Обычно, YAML настаивает на том, чтобы индикатор значения отображения «:» отделялся от значения пробелом.

os2:
  host: hostname
  ip: 10.123.3.182
  path: /var/log/syslog
  file: syslog

Вы должны загрузить YAML (при использовании PyYAML), используя yaml.safe_load(), поскольку абсолютно нетнеобходимо использовать функцию yaml.load(), которая, как задокументировано, потенциально небезопасна.

Используя любое из вышеперечисленных в config.yaml, вы можете сделать:

import sys
import yaml

with open('config.yaml') as stream:
    d = yaml.safe_load(stream)

os2 = d['os2']
# "concatenate" host, ip and path
print('{host}@{ip}:{path}'.format(**d['os2']))

, чтобы получить:

hostname@10.123.3.182:/var/log/syslog
0 голосов
/ 04 октября 2018

Ваш yaml неправильно отформатирован.После : должен быть пробел в каждом из подпунктов, например:

os2:
    host: hostname
    ip: 10.123.3.182
    path: /var/log/syslog
    file: syslog

После этого, если вы выполните data = yaml.load(stream), он должен правильно передать данные следующим образом:

{'os2': {'file': 'syslog',
         'host': 'hostname',
         'ip': '10.123.3.182',
         'path': '/var/log/syslog'}}

Кроме того, вам не нужна строка from yaml import load, dump, поскольку вы уже набрали import yaml во всей ее полноте.

После загрузки данных вы можете делать с ней практически все, что пожелаете.Возможно, вы захотите использовать str.format() или f строк (Python 3.6 +) как таковые:

'{host}@{ip}:{path}'.format(**data['os2'])

# 'hostname@10.123.3.182:/var/log/syslog'

это называется форматирование строк .Бит **data['os2'] по сути распаковывает словарь внутри `data ['os2'], поэтому вы можете ссылаться на ключи непосредственно в вашей строке следующим образом:

{'file': 'syslog',
 'host': 'hostname',
 'ip': '10.123.3.182',
 'path': '/var/log/syslog'}

Обратите внимание, что поскольку ваш yaml не делает 'Если вы не включите ключ или значение «ubuntu», вы не сможете получить ссылку на эту строку, если вы не обновите yaml.

. Примечание. Не путайте ключи словаря с атрибутами.Вы не можете ссылаться на data.os2.file, поскольку в словаре такого атрибута не существует.Однако вы можете ссылаться на data['os2']['file'] (обратите внимание, что они в строках), чтобы получить сохраненные данные.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...