调用Google Vision批量转图片为文本报IndexError: list index out of range如何解决
错误原因
- 索引对应关系错误:外层循环变量
i是图片的序号(范围0~234),而write1、write2是全局累加的列表,每识别到1个文本块才追加1个元素,列表长度是所有图片已识别的文本块总数量,和图片序号没有对应关系。例如第一张图只识别到1个文本块,处理第二张图(i=1)时write1长度仅为1,访问write1[1]就会触发越界。 - 写文件逻辑位置错误:写文件操作放在了遍历文本块的内层循环中,每次遍历文本块都会用覆盖写模式打开文件,最终每个txt只会保存当前图片最后一个文本块的内容,不符合批量识别输出全量内容的需求。
- 列表未重置导致内容混杂:
write1、write2是全局变量,所有图片的识别结果都会追加到同一个列表中,就算索引不越界,输出的内容也会混杂多张图片的识别结果。
排查验证方法
- 在报错行前添加打印语句,确认索引和列表长度的对应关系:
print(f"当前图片序号:{i}, write1列表长度:{len(write1)}, write2列表长度:{len(write2)}")
- 打印每张图的
len(texts),确认是否存在部分图片无识别结果、texts为空的情况,这种情况也会导致没有元素追加到列表中,后续索引访问越界。
修复后的代码
import io import os os.environ["GOOGLE_APPLICATION_CREDENTIALS"]="future-shuttle-323208-1e6aebdb018d.json" from google.cloud import vision # 客户端仅需初始化一次,无需放在循环内重复创建提升效率 client = vision.ImageAnnotatorClient() for i in range(0,235): file_name = os.path.abspath("v2i/%d.png"%(i)) with io.open(file_name, 'rb') as image_file: content = image_file.read() image = vision.Image(content=content) response = client.text_detection(image=image) texts = response.text_annotations i_str=str(i) filename='i2tvision/'+i_str+'.txt' # 每张图单独初始化存储列表,避免和其他图片内容混杂 write_content = [] for text in texts: text_str = '\n"{}"'.format(text.description) vertices = (['({},{})'.format(vertex.x, vertex.y) for vertex in text.bounding_poly.vertices]) bound_str = ' bounds: {}'.format(','.join(vertices)) # 直接拼接当前文本块的内容和坐标加入列表,无需拆分两个列表 write_content.append(text_str + bound_str) # 遍历完当前图所有文本块后,一次性写入文件,避免覆盖问题 with open(filename, 'w', encoding='utf-8') as f: f.writelines(write_content) if response.error.message: raise Exception( '{}\nFor more info on error messages, check: ' 'https://cloud.google.com/apis/design/errors'.format( response.error.message))
内容的提问来源于stack exchange,提问作者陳昱廷
相关产品推荐
相关产品推荐

