[英]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.