读取csv标注裁剪图片时出现Input/output error报错如何解决
图片裁剪I/O错误解决方案
核心报错原因
- 图片资源句柄未正确释放:当前代码用
Image.open()打开图片后没有显式关闭,循环中对同一路径先读后写时,系统会判定文件仍被占用,触发I/O冲突。 - 裁剪坐标类型不兼容:CSV中导出的xmin/ymin等坐标是浮点类型,部分版本的PIL库要求crop方法传入整数像素值,类型不匹配可能引发写入异常。
- 直接覆盖原文件的读写冲突:在文件仍被读取占用时直接写入同路径,会触发系统层面的I/O限制。
修复后可直接运行的代码
import os from PIL import Image import pandas as pd data = pd.read_csv('labels.csv') for index, row in data.iterrows(): input_name = os.path.join("imagesXRP", row["filename"]) # 坐标转整数,同时做边界校验避免裁剪越界 xmin = int(max(0, row["xmin"])) ymin = int(max(0, row["ymin"])) xmax = int(min(row["width"], row["xmax"])) ymax = int(min(row["height"], row["ymax"])) tmp_path = input_name + '.tmp' try: # 用with上下文管理器自动释放图片资源,避免句柄泄漏 with Image.open(input_name) as im: im_cropped = im.crop((xmin, ymin, xmax, ymax)) # 先写入临时文件,避免写入失败损坏原文件 im_cropped.save(tmp_path) # 写入完成后原子替换原文件 os.replace(tmp_path, input_name) except Exception as e: print(f"处理文件{input_name}失败,错误信息:{e}") # 清理残留的临时文件 if os.path.exists(tmp_path): os.remove(tmp_path)
补充排查项
如果修改后仍有报错,可手动验证两点:
- 用系统自带的图片查看器打开报错的图片,确认文件本身没有损坏
- 确认运行代码的用户对
imagesXRP目录有读写权限,避免权限类问题触发I/O报错
内容的提问来源于stack exchange,提问作者JuniorPython
相关产品推荐
相关产品推荐

