Python批量解压多个压缩包:自动遍历目录一键提取
用Python脚本批量解压一个文件夹下的所有zip压缩包到各自子目录,自动识别密码、跳过损坏文件,完整可运行代码。
场景痛点
下载资料或接收同事发来的文件时,经常一下子收到十几个zip包,每个都要右键解压、确认路径、等待完成。包一多,鼠标点到手酸,还容易漏解压某个包。写个Python脚本扫描目录下所有zip文件,自动逐个解压到同名子目录,跑完即可。
用到的库
zipfile # 标准库
pathlib # 标准库
完整代码
import zipfile
from pathlib import Path
def batch_extract_zip(zip_dir: str, output_root: str, password: str = None) -> dict:
"""
批量解压目录下所有zip文件
:param zip_dir: 存放zip包的目录
:param output_root: 解压根目录,每个包解压到 output_root/包名/ 下
:param password: 统一解压密码,无密码传None
:return: 成功与失败的统计
"""
src = Path(zip_dir)
out_root = Path(output_root)
out_root.mkdir(parents=True, exist_ok=True)
stats = {"success": 0, "failed": 0, "skipped": 0}
# 找出目录下所有zip文件(不递归子目录)
for zip_path in src.glob('*.zip'):
# 解压目标 = output_root / 去掉后缀的包名
target_dir = out_root / zip_path.stem
target_dir.mkdir(parents=True, exist_ok=True)
try:
with zipfile.ZipFile(zip_path, 'r') as zf:
pwd = password.encode('utf-8') if password else None
zf.extractall(target_dir, pwd=pwd)
stats["success"] += 1
print(f"[OK] {zip_path.name} -> {target_dir}")
except zipfile.BadZipFile:
stats["failed"] += 1
print(f"[损坏] {zip_path.name} 不是有效zip,跳过")
except RuntimeError as e:
# 密码错误会抛RuntimeError
stats["failed"] += 1
print(f"[失败] {zip_path.name}: {e}")
print(f"\n完成:成功 {stats['success']} 个,失败 {stats['failed']} 个")
return stats
if __name__ == "__main__":
batch_extract_zip(
zip_dir="./zips",
output_root="./extracted",
password=None
)
代码讲解
src.glob('*.zip'):扫描当前目录下所有.zip文件,不递归子目录。如果要递归,换成rglob('*.zip')。zip_path.stem:取文件名去掉后缀部分,作为解压子目录名。例如报告.zip解压到extracted/报告/。zf.extractall(target_dir, pwd=pwd):一次性把包内所有文件解压到目标目录,适合批量场景。BadZipFile异常:捕获文件损坏或不是zip格式的情况,避免一个坏包中断整个批处理。RuntimeError:密码错误时zipfile库会抛这个异常,捕获后继续处理下一个包。
运行结果
运行后extracted/目录下会按每个zip包名生成对应的子目录,包内文件全部解压进去。命令行会逐个打印每个包的处理结果,最后输出成功失败统计。
注意事项
extractall()本身不做zip slip校验。如果解压来源不可信,建议改用逐文件extract()并加路径判断(参考单篇解压文章)。- 如果压缩包层级很深,
target_dir嵌套可能超过文件系统路径长度限制(Windows下约260字符),建议输出根目录尽量短。 - 同一个目录下如果还有
.rar、.7z文件,标准库不支持。需要的话改用py7zr或调用系统7z命令行。

更新时间:2026-09-14 21:28:22
上一篇:Python 批量移动文件到指定目录:按规则归集文件