如何捕获PIL.UnidentifiedImageError?Zip图片读取异常处理求助
解决你的Zip图片读取异常问题
咱们先拆解下你遇到的两个核心问题,再一步步修正代码:
问题1:NameError - 未定义UnidentifiedImageError
这个异常类是PIL库的专属异常,你需要先从PIL.Image模块里导入它,否则Python根本不知道这个异常是什么。
问题2:try-except逻辑范围错误
你的try块只包裹了Image.open这一步,但如果这一步抛出异常,后面的img_data.convert('L')和数组转换代码还是会执行——这时候img_data根本没被成功定义,会引发新的错误。所以得把所有依赖img_data的处理逻辑都放进try块里,或者在捕获异常后直接跳过当前图片的后续操作。
修正后的完整代码
from zipfile import ZipFile from PIL import Image, UnidentifiedImageError # 新增异常类导入 from io import BytesIO import numpy as np file_paths = [] problem_files = [] img_list = [] with ZipFile('/XXXXX/YYYYY/ZZZZZ/AI_ML/Project2/words.zip') as myzip: contents = myzip.namelist() # 优化遍历方式,不用下标循环更简洁 for text in contents: if '.png' in text and 'MACOSX' not in text: file_paths.append(text) for path in file_paths: img = myzip.read(path) try: # 把所有图片处理逻辑都放进try块 img_data = Image.open(BytesIO(img)) img_data = img_data.convert('L') # 转灰度图 image_as_array = np.array(img_data, np.uint8) img_list.append(image_as_array) except UnidentifiedImageError: # 捕获异常后记录路径,直接跳过当前图片后续处理 problem_files.append(path) print(f"无法识别图片文件: {path}")
额外小优化
- 遍历Zip内容时,直接迭代
contents元素比用range(len(contents))更易读维护; - 加个print提示,能实时看到哪些图片出了问题,方便排查;
- 确保已安装依赖库:
pip install pillow numpy
这样修改后,代码就能正确捕获无法识别的图片并记录路径,同时正常处理可读取的图片转换成数组啦。
内容的提问来源于stack exchange,提问作者Raja Malyala




