Search code examples
pythonpyyaml

Parsing yaml file and getting a dictionary


I'd like to be able to take the YAML defined below and turn it into a dictionary.

development:
    user:dev_uid
    pass:dev_pwd
    host:127.0.0.1
    database:dev_db

production:
    user:uid
    pass:pwd
    host:127.0.0.2
    database:db

I have been able to use the YAML library to load the data in. However, my dictionary appears to contain the environmental items as a long string.

This code:

#!/usr/bin/python3

import yaml

config  = yaml.load(open('database.conf', 'r'))

print(config['development'])

yields the following output.

user:dev_uid pass:dev_pwd host:127.0.0.1 database:dev_db

I can't access any of the entries by key name or load that string subsequent using the yaml.load method.

print(config['development']['user'])

This code yields the following error:

TypeError: string indices must be integers

Ideally I would like to end up with a parsing function that returns a dictionary or a list so I can access the properties by key name or using the dot operator like:

print(config['development']['user'])
config.user

Where am I going wrong?


Solution

  • Your "yaml" is not a mapping of mappings, it's a mapping of strings. In YAML 1.2, block mapping entries need whitespace after the separator, e.g.

    development:
        user: dev_uid
        pass: dev_pwd
        host: 127.0.0.1
        database: dev_db
    
    production:
        user: uid
        pass: pwd
        host: 127.0.0.2
        database: db
    

    Don't try to pre-process this text. Instead, find who generated the markup and throw the spec at them.