Zippy Zeppoli Zippy Zeppoli - 3 months ago 6
YAML Question

Converting YAML file to python dict

I am having the following problem of mapping documents within a YAML file to a

dict
and properly mapping them.

I have the following YAML file, which represents a server (
db.yml
):

instanceId: i-aaaaaaaa
environment:us-east
serverId:someServer
awsHostname:ip-someip
serverName:somewebsite.com
ipAddr:192.168.0.1
roles:[webserver,php]


I load this YAML file, which I can do without any problems, I think I understand that.

instanceId = getInstanceId()
stream = file('db.yml', 'r')
dict = yaml.load_all(stream)

for key in dict:
if key in dict == "instanceId":
print key, dict[key]


I'd like the logic to work like the following:


  • load yaml, map to dict

  • look in every dict in the document, if the
    instanceId
    matches that which was set by
    getInstanceId()
    , then print out all of the keys and values for that document.



If I look at the map data structure from the command line, I get:

{'instanceId': 'i-aaaaaaaa environment:us-east serverId:someServer awsHostname:ip-someip serverName:someserver ipAddr:192.168.0.1 roles:[webserver,php]'}


I think I might be creating the data structure for the YAML file improperly, and on matching the contents on the
dict
, I am a bit lost.

Side note: I cannot load all of the documents in this file using
yaml.load()
, I tried
yaml.load_all()
, which seems to work but my main issue still exists.

Answer

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, value


environment us-east
roles ['webserver', 'php']
awsHostname ip-someip
serverName somewebsite.com
ipAddr 192.168.0.1
serverId someServer
Id i-aaaaaaaa