从yaml文件加载的python对象中读取值

时间:2018-10-04 15:57:50

标签: python dictionary yaml

我有一个脚本,可将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 :(得分:1)

您的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 strings (Python 3.6+)

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

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

这称为string formatting **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'](注意它们在字符串中)来检索存储的数据。

答案 1 :(得分:0)

您的YAML非常正常,并且如您所见here一样加载。

您有一个键(os2),作为值,它是遵循YAML标准的多行纯标量,它作为带有空格的字符串加载,其中YAML具有换行符和空格。因此,该值将加载为"host:hostname ip:10.123.3.182 path:/var/log/syslog file:syslog"

由于您指出期望值(多个),因此必须引入使os2的值成为流样式映射(在这种情况下,您必须引用标量,否则您可能无法在有效的YAML中将纯网址写为标量)

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

或者您应该遵循YAML standard中的指南

  

通常,YAML坚持使用空格将“:”映射值指示符与值分开。

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

您应该使用yaml.safe_load()加载YAML(使用PyYAML时),因为绝对不需要使用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

答案 2 :(得分:-1)

您的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)