我有一个解析对象的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']
或者我在这里完全错了?
答案 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