Converting YAML file to python dict
I think your yaml file should look like (or at least something like, so it's structured correctly anyway):
instance: Id: i-aaaaaaaa environment: us-east serverId: someServer awsHostname: ip-someip serverName: somewebsite.com ipAddr: 192.168.0.1 roles: [webserver,php]
Then, yaml.load(...)
returns:
{'instance': {'environment': 'us-east', 'roles': ['webserver', 'php'], 'awsHostname': 'ip-someip', 'serverName': 'somewebsite.com', 'ipAddr': '192.168.0.1', 'serverId': 'someServer', 'Id': 'i-aaaaaaaa'}}
And you can go from there...
So used like:
>>> for key, value in yaml.load(open('test.txt'))['instance'].iteritems(): print key, valueenvironment us-eastroles ['webserver', 'php']awsHostname ip-someipserverName somewebsite.comipAddr 192.168.0.1serverId someServerId i-aaaaaaaa
An additional bug in your code, that doesn't have to do with YAML:
for key in dict: if key in dict == "instanceId": # This doesn't do what you want print key, dict[key]
in
is an operator that works on sequence types, and also on maps. This is why this isn't a syntax error... but it doesn't do what you want.
key in dict
will always evaluate to True
, because all the keys you're iterating through are in the dict. So your code boils down to True == "instanceId"
, which will always evaluate to False
, because the boolean value True
is never equal to that string.
You might have noticed that the print
statement doesn't produce any output; this is because it never gets called.
Just use python-benedict
, it's a dict subclass that provides I/O support for most common formats, including yaml
.
from benedict import benedict# path can be a yaml string, a filepath or a remote urlpath = 'path/to/data.yml'd = benedict.from_yaml(path)# do stuff with your dict# ...# write it back to diskd.to_yaml(filepath=path)
It's well tested and documented, check the README to see all the features:https://github.com/fabiocaccamo/python-benedict
Install using pip: pip install python-benedict
Note: I am the author of this project