【问题标题】:Accessing YAML data in Python在 Python 中访问 YAML 数据
【发布时间】:2013-03-28 17:15:41
【问题描述】:

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

还是我完全错了?

【问题讨论】:

    标签: python yaml


    【解决方案1】:

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

    例如,settingsMap['name'] 是一个 list 字典。

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

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

    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
    

    【讨论】:

    • 数据结构的选择应该取决于数据的含义以及您打算如何使用/访问/更改数据。上面的建议使访问片段的语法更容易,但我不知道我是否以某种无效的方式改变了含义。
    猜你喜欢
    • 2011-12-28
    • 2022-07-14
    • 2020-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多