在Python中访问YAML数据

时间:2013-03-28 17:15:41

标签: python yaml

我有一个解析对象的YAML文件,例如:

{'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...

我在访问python中的数据时遇到问题,并经常看到错误TypeError: list indices must be integers, not str

我希望能够访问与'name'对应的所有元素,以便检索我想象的每个数据字段:

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']

我希望通过像['name']['categories']['quick']['directory']

之类的东西可以访问每个元素

更深一点的东西就是:

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

或者我在这里完全错了?

1 个答案:

答案 0 :(得分:7)

括号[]表示您有dicts列表,而不仅仅是dict。

例如,settingsMap['name']是一个列表的dicts。

因此,您需要使用整数索引在列表中选择正确的dict,然后才能在dict中选择键。

因此,给出您当前的数据结构,您需要使用:

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

或者,修改底层的YAML数据结构。


例如,如果数据结构如下所示:

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'}}}}}

然后您可以使用

访问与上面相同的值
settingsMap['name']['categories']['quick']['directory']
# quick