Search code examples
pythonpyyaml

How to get data from a yml file, to then return as a dictionary


I have a python function that will open a YAML file and read the data. The YAML file contains two api keys and a domain. I want to return each value in a dictionary so it can be used in the program. However I get the error

"list indices must be integers, not str".

Should I just make the variables global, so it doesn't have to return anything?

The code is:

def ImportConfig():
    with open("config.yml", 'r') as ymlfile:
        config = yaml.load(ymlfile)
        darksky_api = config['darksky']['api_key']
        gmaps_api = ['gmaps']['api_key']
        gmaps_domain = ['gmaps']['domain']
    return {'darksky_api_key': darksky_api, 'gmaps_api_key': gmaps_api, 'gmaps_domain': gmaps_domain }

What does it mean that the list indices must be integers? I thought curly brackets indicated a dictionary? Also is there a better way to do this?


Solution

  • Independent of your yaml file if you type ['xy'] a the prompt of Python you create a list with one element and if you then index that with another string:

    ['xy']['abc']
    

    you'll get that error.

    You are missing config in line 5 and 6 of your program:

    def ImportConfig():
        with open("config.yml", 'r') as ymlfile:
            config = yaml.safe_load(ymlfile)
            darksky_api = config['darksky']['api_key']
            gmaps_api = config['gmaps']['api_key']
            gmaps_domain = config['gmaps']['domain']
        return {'darksky_api_key': darksky_api, 'gmaps_api_key': gmaps_api, 'gmaps_domain': gmaps_domain }
    

    please note that using load in PyYAML is security risk and for your data you should use safe_load().