我有一个脚本,可将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
答案 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)