You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何捕获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

火山引擎 最新活动