如何递归提取嵌套ZIP中fire_bundle下的_dnbr6.tif文件?
解决方案:递归提取嵌套ZIP中的目标文件
可以用Python的zipfile库实现需求,无需解压所有文件,仅在遇到符合条件的嵌套ZIP时递归处理,直接提取目标文件到指定目录。以下是完整实现:
核心逻辑
- 递归遍历ZIP内的每个成员
- 匹配到
_dnbr6.tif结尾的文件直接提取 - 遇到名称含
fire_bundle(大小写不敏感)的ZIP文件时,读取其字节流并递归处理,无需先保存到本地
代码实现
import zipfile import os from io import BytesIO def extract_target_files(zip_ref, output_dir): """ 递归处理ZIP文件,提取目标文件 :param zip_ref: 已打开的zipfile.ZipFile对象 :param output_dir: 提取文件的输出目录 """ os.makedirs(output_dir, exist_ok=True) for item in zip_ref.infolist(): # 匹配目标文件:文件名以_dnbr6.tif结尾(大小写不敏感) if item.filename.lower().endswith('_dnbr6.tif'): zip_ref.extract(item, output_dir) print(f"已提取: {item.filename}") continue # 匹配符合条件的嵌套ZIP:是文件、含zip后缀、名称包含fire_bundle(大小写不敏感) if (not item.is_dir() and '.zip' in item.filename.lower() and 'fire_bundle' in item.filename.lower()): # 读取嵌套ZIP的字节流,在内存中处理 nested_zip_data = zip_ref.read(item.filename) with zipfile.ZipFile(BytesIO(nested_zip_data), 'r') as nested_zip: print(f"递归处理嵌套ZIP: {item.filename}") extract_target_files(nested_zip, output_dir) def main(input_zip_path, output_dir): """ 主函数:处理顶层ZIP文件 :param input_zip_path: 顶层ZIP文件的路径 :param output_dir: 提取文件的输出目录 """ with zipfile.ZipFile(input_zip_path, 'r') as top_zip: extract_target_files(top_zip, output_dir) if __name__ == "__main__": # 替换为你的顶层ZIP路径和输出目录 INPUT_ZIP = "path/to/your/top_level.zip" OUTPUT_DIR = "extracted_dnbr6_files" main(INPUT_ZIP, OUTPUT_DIR)
关键细节说明
- 无冗余解压:嵌套ZIP通过
BytesIO在内存中读取处理,不会将无关文件写入磁盘 - 大小写兼容:所有文件名转小写后判断,适配
Fire_Bundle.zip、FIRE_BUNDLE等不同大小写的情况 - 重名处理:默认重名文件会覆盖,可自行添加逻辑(比如给文件名加嵌套路径前缀)避免冲突
- 目录过滤:通过
item.is_dir()跳过目录成员,只处理文件类型的内容
内容的提问来源于stack exchange,提问作者Guillermo.D
相关产品推荐
相关产品推荐

