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

括弧 ,[]は、dict だけでなく、dict のリストがあることを示します。

たとえば、辞書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 に答える