Python使用EasyOCR报索引越界 如何正确提取列表目标元素
EasyOCR结果提取索引越界问题修复
报错核心原因
你出现list index out of range是两个认知错误导致的:
- Python列表索引从0开始计数,不是从1开始。你给出的示例返回结构
[([[17, 11], [57, 11], [57, 61], [17, 61]], '2', 1.0)]最外层是长度为1的列表,仅存在索引为0的元素,你直接写result[1]是访问不存在的第二个元素,必然触发越界。 - 对返回结构的层级理解错误:
readtext()返回的列表中,每个元素是一个三元组,对应一个识别到的文本块,三元组的结构固定为:- 索引0:文本框四个角的坐标数组
- 索引1:识别出的文本内容(也就是你要提取的'2')
- 索引2:识别置信度(0-1之间,数值越高可信度越高)
另外你原代码没有做结果判空:部分图片可能识别不到任何文本,此时result是空列表,直接写死索引也会触发越界。原代码拼接结果时直接转整个result对象为字符串,也会把坐标、置信度这些无关内容拼进去。
修正后代码
单文本块提取(适配你示例中每张图只有一个数字的场景)
number = 1 sresult = '' reader = easyocr.Reader(['en']) for number in range(1, 82): result = reader.readtext(f"{datadrop}{number}.png") # 先判断是否识别到有效结果,避免空列表报错 if result: # 取第一个识别块的文本内容:列表第0位是第一个识别块,元组第1位是文本 target_text = result[0][1] print(target_text) sresult = target_text + sresult else: print(f"第{number}张图片未识别到有效内容") print("最终拼接结果:\n", sresult)
多文本块提取(如果单张图可能识别到多个内容)
如果后续遇到单张图有多个文本的场景,遍历所有识别块即可,不用写死索引:
number = 1 sresult = '' reader = easyocr.Reader(['en']) for number in range(1, 82): result = reader.readtext(f"{datadrop}{number}.png") if result: for block in result: target_text = block[1] print(target_text) sresult = target_text + sresult else: print(f"第{number}张图片未识别到有效内容") print("最终拼接结果:\n", sresult)
原代码错误点对照
- 错误写法
print(result[1][0]):result[1]访问不存在的第二个识别块,就算索引写对为0,[0]取到的是坐标数组,不是你要的文本。 - 原拼接逻辑
sresult = str(result) +sresult:直接把整个返回列表(包含坐标、置信度)转字符串拼接,输出会带大量无关格式内容。
内容的提问来源于stack exchange,提问作者Kevin Jones
相关产品推荐
相关产品推荐

