Python无需解压Zip包提取指定子目录下的.jp2文件列表
直接读取Zip内符合规则的.jp2文件路径
解决方案:用Python的zipfile模块结合fnmatch筛选
不用解压整个Zip包,直接通过zipfile遍历压缩包内的所有文件条目,再用fnmatch匹配你需要的路径规则,完全复现原来glob的筛选逻辑。
单Zip文件处理代码
import zipfile import fnmatch zip_path = r'C:\path-to-your-zip\S2A_MSIL2A_20170420T103021_N0204_R108_T32UNB_20170420T103454.zip' # 对应原glob的匹配规则,适配Zip内部路径格式 pattern = '*SAFE/**/IMG_DATA/**/R60m/*B??_??m.jp2' jp2_files = [] with zipfile.ZipFile(zip_path, 'r') as zip_ref: # 遍历Zip内所有文件条目 for file_info in zip_ref.infolist(): # 跳过目录,只处理文件 if not file_info.is_dir(): # 用fnmatch匹配路径规则 if fnmatch.fnmatch(file_info.filename, pattern): jp2_files.append(file_info.filename) # 输出筛选后的文件路径 for file in jp2_files: print(file)
多Zip文件批量处理
如果要自动化处理多个Zip文件,可以封装成函数:
import zipfile import fnmatch import os def get_jp2_from_zips(zip_dir): jp2_all = [] # 遍历目标目录下所有.zip文件 for filename in os.listdir(zip_dir): if filename.endswith('.zip'): zip_path = os.path.join(zip_dir, filename) pattern = '*SAFE/**/IMG_DATA/**/R60m/*B??_??m.jp2' with zipfile.ZipFile(zip_path, 'r') as zip_ref: for file_info in zip_ref.infolist(): if not file_info.is_dir() and fnmatch.fnmatch(file_info.filename, pattern): # 带上Zip文件名,方便后续区分文件来源 jp2_all.append(f"{zip_path}::{file_info.filename}") return jp2_all # 使用示例 target_dir = r'C:\your-zip-folder' all_jp2 = get_jp2_from_zips(target_dir) for item in all_jp2: print(item)
关键说明
zipfile.ZipFile:以只读模式打开Zip包,无需解压即可访问内部所有条目fnmatch.fnmatch:支持和glob完全一致的通配符语法,完美复现你原来的筛选逻辑- 跳过目录条目:通过
file_info.is_dir()判断,避免把目录路径混入结果列表 - 若需要直接读取.jp2文件内容,可通过
zip_ref.open(file_info.filename)获取文件对象,直接进行后续处理(比如用GDAL读取影像),全程无需解压。
内容的提问来源于stack exchange,提问作者KosV
相关产品推荐
相关产品推荐

