两次调用SheetImageLoader读取同一Excel单元格图片触发I/O已关闭文件错误
问题解决:重复读取Excel单元格图片触发"I/O operation on closed file"错误
问题原因
SheetImageLoader的get方法在读取一次图片后,会关闭关联的文件流,第二次调用同一单元格的get时,就会触发已关闭文件的IO操作错误。
解决方案
方案1:缓存已读取的图片
把第一次读取到的图片存在字典里,后续直接用缓存内容,不用重复调用image_loader.get():
workbook = load_workbook(path) sheet = workbook.active image_loader = SheetImageLoader(sheet) # 用字典缓存已读取的图片 image_cache = {} def get_cell_image(image_loader, cell_name): # 先检查缓存,存在则直接返回副本(避免原数组被意外修改) if cell_name in image_cache: return image_cache[cell_name].copy() # 第一次读取图片并转换格式,存入缓存 image = image_loader.get(cell_name) image_np = np.array(image) image_bgr = cv2.cvtColor(image_np, cv2.COLOR_RGB2BGR) image_cache[cell_name] = image_bgr return image_bgr # 现在两次调用都能正常执行 get_cell_image(image_loader, 'A2') get_cell_image(image_loader, 'A2')
方案2:循环内重新初始化加载器
针对两层循环的场景,每次进入内层循环前重新加载工作簿和SheetImageLoader,确保每次读取时文件流处于打开状态:
path = "你的Excel文件路径" # 外层循环 for _ in outer_loop_items: # 每次重新加载工作簿和图片加载器 workbook = load_workbook(path) sheet = workbook.active image_loader = SheetImageLoader(sheet) # 内层循环读取所有图片 for cell_name in target_cells: image = get_cell_image(image_loader, cell_name) # 这里编写你的图片处理逻辑
内容的提问来源于stack exchange,提问作者Vignesh
相关产品推荐
相关产品推荐

