必须先用zf.namelist()确认zip内文件真实路径(含大小写、斜杠方向、前导目录),再精确匹配提取;zipfile不支持通配符,需用fnmatch等手动筛选;注意windows打包的编码兼容性问题。

能直接提取,但必须先确认压缩包内文件路径是否匹配——大小写、斜杠方向、前导目录都算在内。
用 zipfile.ZipFile 打开并检查内容
Python 标准库的 zipfile 模块不支持通配符模糊匹配,得先列出所有成员再筛选。常见错误是直接传入 "data.csv" 却忽略 ZIP 里实际存的是 "./output/data.csv" 或 "Output/Data.csv"。
- 用
zf.namelist()看真实路径(注意大小写和斜杠方向) - Windows 打包的 ZIP 可能用反斜杠
\,但namelist()总返回正斜杠/ - 路径含中文时,确保 ZIP 是 UTF-8 编码打包(旧工具如 WinRAR 默认 GBK,会乱码)
提取单个匹配文件到内存或磁盘
找到目标路径后,用 zf.read() 读取字节流,或 zf.extract() 写入文件系统。别直接用 extractall(),它不支持按名过滤,且可能覆盖同名文件。
- 提取到内存:
content = zf.read("logs/app.log")—— 注意路径必须完全一致 - 提取到指定目录:
zf.extract("config.json", path="/tmp/dest"),path参数是父目录,不是完整路径 - 若路径不存在,
extract()会自动创建子目录;但read()报KeyError表示没找到
批量提取多个文件(含通配符)
zipfile 本身不支持 *.txt 这类 glob,得自己用 fnmatch 或 pathlib.PurePosixPath 匹配。
- 用
fnmatch.filter(zf.namelist(), "*.py")获取所有 Python 文件名 - 注意
fnmatch不区分大小写,但 ZIP 路径区分;"*.PY"和"*.py"结果可能不同 - 提取多个时建议逐个调用
extract(),避免一次性解压整个 ZIP 占满磁盘
最易被忽略的是 ZIP 的编码兼容性问题:Linux/macOS 下用 zip 命令打的包默认 UTF-8,而 Windows 上多数 GUI 工具用本地编码(如 CP936),此时 namelist() 返回的路径会是乱码,read() 直接报 KeyError。遇到这种情况,得用 zipfile.ZipFile(..., metadata_encoding="GBK")(Python 3.11+)或手动重编码处理。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











