Accessing YAML Data in Python

I have a YAML file that parses an object, for example:

{'name': [{'proj_directory': '/directory/'}, {'categories': [{'quick': [{'directory': 'quick'}, {'description': None}, {'table_name': 'quick'}]}, {'intermediate': [{'directory': 'intermediate'}, {'description': None}, {'table_name': 'intermediate'}]}, {'research': [{'directory': 'research'}, {'description': None}, {'table_name': 'research'}]}]}, {'nomenclature': [{'extension': 'nc'} {'handler': 'script'}, {'filename': [{'id': [{'type': 'VARCHAR'}]}, {'date': [{'type': 'DATE'}]}, {'v': [{'type': 'INT'}]}]}, {'data': [{'time': [{'variable_name': 'time'}, {'units': 'minutes since 1-1-1980 00:00 UTC'}, {'latitude': [{'variable_n... 

I'm having problems accessing data in python and regularly looking at TypeError: list indices must be integers, not str errors TypeError: list indices must be integers, not str

I want to have access to all elements matching 'name' , so to retrieve each data field, I assume that it will look something like this:

 import yaml settings_stream = open('file.yaml', 'r') settingsMap = yaml.safe_load(settings_stream) yaml_stream = True print 'loaded settings for: ', for project in settingsMap: print project + ', ' + settingsMap[project]['project_directory'] 

and I would expect each item to be accessible via something like ['name']['categories']['quick']['directory']

and something a little deeper:

['name']['nomenclature']['data']['latitude']['variable_name']

or am I completely wrong here?

+4
source share
1 answer

The brackets, [] , indicate that you have dicts lists, not just dict ones.

For example, settingsMap['name'] is a list from dicts.

Therefore, you need to select the correct dict in the list using the integer index before you can select the key in the dict.

So, providing the current data structure, you will need to use:

 settingsMap['name'][1]['categories'][0]['quick'][0]['directory'] 

Or change the structure of the YAML database.


For example, if the data structure looked like this:

 settingsMap = { 'name': {'proj_directory': '/directory/', 'categories': {'quick': {'directory': 'quick', 'description': None, 'table_name': 'quick'}}, 'intermediate': {'directory': 'intermediate', 'description': None, 'table_name': 'intermediate'}, 'research': {'directory': 'research', 'description': None, 'table_name': 'research'}, 'nomenclature': {'extension': 'nc', 'handler': 'script', 'filename': {'id': {'type': 'VARCHAR'}, 'date': {'type': 'DATE'}, 'v': {'type': 'INT'}}, 'data': {'time': {'variable_name': 'time', 'units': 'minutes since 1-1-1980 00:00 UTC'}}}}} 

then you can access the same value as above with

 settingsMap['name']['categories']['quick']['directory'] # quick 
+5
source

All Articles