为什么手动遍历JSON数据正常,用for循环遍历asyncio返回结果时报错?
问题原因说明
你遇到的报错和异步运行逻辑无关,核心是对asyncio.gather()的返回值结构理解错误:
asyncio.gather(*tasks)会按任务提交顺序,将所有异步任务的返回值组装为列表返回,你代码中search_ids共10个元素,最终拿到的responses是长度为10的列表,每个元素才是单条API请求返回的results['Response']对象、也就是包含entries字段的字典。你直接对列表使用['entries']做字符串索引,自然会触发TypeError: list indices must be integers or slices, not str报错。
你第二段代码可以正常运行,是因为你先遍历了responses列表的每个元素y(也就是单条请求的响应结果),再手动取y['entries']的固定索引,和你第一段想实现的逻辑只差一层嵌套循环而已,不需要手动写固定索引。
修正后的代码
只需要调整main函数中遍历部分的逻辑即可:
async def main(): async with aiohttp.ClientSession() as session: tasks = [] for search_id in search_ids: task = asyncio.ensure_future(get_data(session, search_id)) tasks.append(task) responses = await asyncio.gather(*tasks) # 先遍历所有请求的响应结果 for resp in responses: # 再遍历单个响应中的所有entries,无需手动写索引 for entry in resp['entries']: stats['Display Name'].append(entry['player']['UserInfo']['displayName'])
如果后续需要提取更多字段,也只需要在第二层遍历entry的循环中添加对应的存储逻辑即可,不管每个响应的entries有多少条都能自动处理。
内容的提问来源于stack exchange,提问作者terribleatthis
相关产品推荐
相关产品推荐

