解析字典时触发IndexError: list index out of range错误,求排查
解决IndexError: list index out of range问题
让我帮你一步步找出代码里的问题,然后修正它:
错误原因分析
你的代码里有几个关键的逻辑错误,直接导致了索引越界:
内层循环遍历对象错误
你内层循环写的是for eachnode in file_dict["KPIS"],但你实际需要遍历的是节点列表file_dict["NODES"]——你要给每个节点对应填充KPI的状态值,而不是遍历所有KPI。这个错误会让你在访问eachnode[ind + 1]时,很快就超出列表的索引范围。KPI名称获取方式错误
eachnode[0][0]是完全错误的写法:eachnode是KPIS里的单个KPI列表,eachnode[0]已经是KPI的名称字符串(比如VoLTE MO Voice Connection Rate(%)),不需要再额外取[0]。行数据初始化错误
t = [eachkpi]会把整个KPI列表(包含名称和所有节点状态)放进行数据里,而你需要的是把KPI名称作为行的第一个元素,应该写成[eachkpi[0]]。
修改后的代码
rows = [] headers = ["Kpis"] for filename in file_list: # 用with语句自动管理文件关闭,更安全 with open(filename, 'r') as f: file_content = f.read() file_string = json.loads(file_content) # 替换eval为更安全的ast.literal_eval(如果是Python字典格式字符串) import ast file_dict = ast.literal_eval(file_string) if "KPIS" in file_dict and "NODES" in file_dict: # 仅第一次获取表头,避免重复添加 if len(headers) == 1: headers.extend(file_dict["NODES"]) node_count = len(file_dict["NODES"]) for eachkpi in file_dict["KPIS"]: # 检查KPI数据长度是否匹配节点数量,提前规避索引问题 if len(eachkpi) - 1 != node_count: print(f"警告:KPI {eachkpi[0]} 的状态值数量与节点数不匹配") continue # 初始化行:第一个元素是KPI名称,后面追加所有节点的状态值 t = [eachkpi[0]] t.extend(eachkpi[1:]) rows.append(t)
额外优化建议
- 替换
eval:eval存在严重安全风险,若输入文件不可信,容易被注入恶意代码。如果file_string是Python字典格式字符串,建议用ast.literal_eval解析;如果是标准JSON,直接用json.loads即可,无需二次解析。 - 添加边界检查:代码中加入了KPI数据长度与节点数的校验,能提前发现数据格式不一致的问题,避免后续索引错误。
- 精简循环逻辑:把表头初始化放在第一次读取文件时完成,避免重复执行判断逻辑,提升效率。
内容的提问来源于stack exchange,提问作者canarcho
相关产品推荐
相关产品推荐

