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
相关产品推荐
相关产品推荐

