You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Zip压缩包内路径以__开头的PNG文件无法用PIL打开的解决问询

解决PIL无法打开Zip中__MACOSX开头文件的问题

首先得明确:你碰到的这些__MACOSX/.../._xxx.png文件不是真正的PNG图像——它们是macOS系统压缩文件时自动生成的AppleDouble资源分支文件,用来存储原文件的元数据(比如文件属性、缩略图等),本身不包含可识别的图像数据,所以PIL自然无法识别打开。

针对这个问题,有两种处理思路,首推第一种(高效且契合实际需求):

1. 直接过滤无效文件

既然这些文件不是你需要的图像素材,在收集文件路径阶段就直接排除它们,既节省处理时间,也能彻底避免报错。另外还要修正你原代码里的一个bug:你在with ZipFile块外调用myzip.read(),此时Zip文件已经被自动关闭,会抛出异常,所以要把所有文件处理逻辑放在with上下文管理器内部。

修正后的完整代码:

import pandas as pd
import numpy as np
from zipfile import ZipFile
from io import BytesIO
from PIL import Image
from PIL import UnidentifiedImageError

problem_files = []
file_paths = []
img_list = []
img_size = (128,128)

# 所有操作放在ZipFile上下文内,避免文件提前关闭
with ZipFile('/XXX/YYY/ZZZ/AI_ML/Project2/words.zip') as myzip:
    contents = myzip.namelist()
    # 收集路径时直接过滤__MACOSX开头或包含/._的无效文件
    for text in contents:
        if '.png' in text and not (text.startswith('__MACOSX') or '/._' in text):
            file_paths.append(text)
    
    for path in file_paths:
        try:
            img_data = Image.open(BytesIO(myzip.read(path)))
            # 图像处理流程
            img_data = img_data.convert('L')
            img_data = img_data.resize(img_size)
            image_as_array = np.array(img_data, np.uint8).reshape(1, -1)
            img_list.append(image_as_array)
        except UnidentifiedImageError:
            problem_files.append(path)

2. (不推荐)解析AppleDouble文件

如果出于特殊需求必须处理这些文件,可以尝试解析AppleDouble格式提取其中可能存在的图像数据,但这种文件本身是冗余的,解析逻辑复杂且不稳定,完全没必要在这上面浪费精力。

总结:直接过滤__MACOSX相关文件是最合理的解决方案,既解决了PIL报错问题,也避免了处理无用数据。

内容的提问来源于stack exchange,提问作者Raja Malyala

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 22:32:38