如何修复Python中用txt行号做索引时出现的IndexError列表越界错误
问题原因
- 核心原因是名字存储文件和图片映射文件的行数不一致:你从名字文件读取到的行号
num_linea,大于图片映射文件读取得到的lineas列表的最大索引,直接对不存在的索引位置赋值就会触发索引越界错误。 - 还存在另一个隐藏bug:新增名字的逻辑中,你先把新名字写入文件,再用写入前读取的
lineas列表查找新名字的索引,此时lineas里并没有刚写入的新名字,会直接抛出ValueError。
修复方案
- 修复新增名字的索引逻辑:新增名字时不需要查找索引,直接用写入前列表的长度作为新行的索引,因为追加写入的行默认就是列表长度对应的下标。
- 修复索引越界问题:修改图片映射文件对应行的值前,先判断列表长度是否足够,不够就先填充空值到对应长度。
- 保证两个文件行数永远同步,避免出现行号不匹配的情况。
修改后的关键代码片段
# 原来的新增名字分支修改 if (person_name not in lineas): print("A1") f.write(f"{person_name}\n") # 不要用index找,直接用原来的长度当新索引 num_linea = len(lineas) persons_identifier_img = str(num_linea) + ".jpg" # 原来的redefinition分支修改 if (redefinition == True): f.truncate(0) f.seek(0) # 先判断长度是否足够,不够就填充 while len(lineas) <= num_linea: lineas.append("") lineas[num_linea] = f"{persons_identifier_img}\n" #THIS IS THE LINE f.writelines("\n".join(lineas))
额外优化建议
- 两个文件的读写操作建议放在同一个上下文管理器中,避免中途程序崩溃导致两个文件行数不一致。
- 每次初始化读取两个文件时,如果行数不一致,先自动补全短的文件,填充默认值,从根源避免行号不匹配的问题。
内容的提问来源于stack exchange,提问作者user15898019
相关产品推荐
相关产品推荐

