繁体   English   中英

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

[英]Reading values from python object loaded from yaml file

我有一个将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

您的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'}}

另外,由于您已经完全import yaml ,因此不需要from yaml import load, dump的行。

加载数据后,您几乎可以使用它进行任何操作。 您可能需要这样使用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'] (注意它们在字符串中)来检索存储的数据。

您的YAML非常正常,并且如您在此处所示加载。

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

因为您指出期望值(多个),所以您要么必须引入os2的值,然后将其作为流样式映射(在这种情况下,您必须引用标量,否则,例如,不能在有效的YAML中将纯URL作为标量编写):

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.safe_load()来加载YAML(使用PyYAML时),因为绝对不需要使用yaml.load()函数,该函数据记录可能不安全。

使用config.yaml中的上述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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM