6

我有一个解析为对象的 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']

还是我在这里完全错了?

4

1 回答 1

10

方括号 ,[]表示您有字典列表,而不仅仅是字典。

例如,settingsMap['name']是一个字典列表

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

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

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
于 2013-03-28T17:27:59.767 回答