Python批量提取压缩包密码列表教程
用Python遍历文件夹中的加密ZIP压缩包,配合自定义密码字典批量尝试解压,找回自己忘记密码的压缩文件,记录成功密码到清单。
场景痛点
以前存了一批加密ZIP压缩包,密码是自己设的,结果时间长了全忘了,只记得是某个常用密码段。手动一个一个压缩包去试,右键打开输密码,一百个包能试一下午。用Python写个密码字典脚本,自动遍历所有ZIP,挨个尝试字典里的密码,解出来的把密码记到Excel里,一次跑完。
用到的库
pip install zipfile36 openpyxl
Python3标准库自带 zipfile,下面直接用标准库,不需要额外装。导出清单用 openpyxl。
完整代码
import os
import zipfile
from pathlib import Path
from openpyxl import Workbook
def load_password_dict(dict_path: str) -> list:
"""从文本文件加载密码字典,每行一个密码。"""
path = Path(dict_path)
if not path.exists():
# 字典文件不存在就用内置常用密码兜底
return ["123456", "12345678", "888888", "666666",
"111111", "000000", "admin", "password",
"123123", "520520", "1314520"]
passwords = []
for line in path.read_text(encoding="utf-8", errors="ignore").splitlines():
line = line.strip()
if line:
passwords.append(line)
return passwords
def try_zip_password(zip_path: Path, passwords: list):
"""用密码列表挨个尝试解压,返回第一个成功的密码。"""
try:
with zipfile.ZipFile(zip_path, "r") as zf:
for pwd in passwords:
try:
# 读第一个文件做试探,不解压到磁盘
zf.read(zf.namelist()[0], pwd=pwd.encode("utf-8"))
return pwd
except (RuntimeError, zipfile.BadZipFile):
continue
except Exception:
continue
except zipfile.BadZipFile:
return None
return None
def batch_unlock(zip_dir: str, dict_path: str, out_dir: str):
"""遍历目录下所有zip,批量试密码。"""
root = Path(zip_dir)
out = Path(out_dir)
out.mkdir(parents=True, exist_ok=True)
passwords = load_password_dict(dict_path)
print(f"密码字典共 {len(passwords)} 个候选密码\n")
results = []
for zfile in root.rglob("*.zip"):
print(f"正在尝试:{zfile.name} ...")
pwd = try_zip_password(zfile, passwords)
if pwd:
print(f" 成功!密码 = {pwd}")
# 解压到 out_dir/压缩包名/ 下
target_dir = out / zfile.stem
target_dir.mkdir(exist_ok=True)
with zipfile.ZipFile(zfile, "r") as zf:
zf.extractall(target_dir, pwd=pwd.encode("utf-8"))
results.append({"file": str(zfile), "password": pwd,
"status": "成功"})
else:
print(" 字典中未找到密码")
results.append({"file": str(zfile), "password": "",
"status": "失败"})
return results
def export_to_excel(results: list, out_path: str):
wb = Workbook()
ws = wb.active
ws.title = "解压密码清单"
ws.append(["序号", "压缩包路径", "密码", "状态"])
for idx, r in enumerate(results, 1):
ws.append([idx, r["file"], r["password"], r["status"]])
ws.column_dimensions['A'].width = 8
ws.column_dimensions['B'].width = 70
ws.column_dimensions['C'].width = 20
ws.column_dimensions['D'].width = 10
wb.save(out_path)
if __name__ == "__main__":
ZIP_DIR = r"D:\加密压缩包"
DICT = r"D:\加密压缩包\密码字典.txt"
OUT_DIR = r"D:\加密压缩包\已解密"
results = batch_unlock(ZIP_DIR, DICT, OUT_DIR)
export_to_excel(results, r"D:\加密压缩包\解压密码清单.xlsx")
print(f"\n完成!成功 {sum(1 for r in results if r['status']=='成功')} 个")
代码讲解
zipfile 是Python标准库,读ZIP文件开箱即用。try_zip_password 不解压到磁盘,只读取压缩包里第一个文件的内容做试探,密码对不对马上知道,速度快还不占空间。密码用 encode("utf-8") 转字节串传给 pwd 参数,这是zipfile库的要求。rglob("*.zip") 递归找所有zip文件,包括子目录。解压时每个压缩包单独建一个子文件夹,防止不同压缩包里同名文件互相覆盖。字典文件不存在时用内置常用密码兜底,不至于空跑。
运行结果
控制台逐个打印压缩包名称和尝试结果,成功的立即解压到"已解密"文件夹。最后生成 解压密码清单.xlsx,四列:序号、压缩包路径、密码、状态。成功的密码一目了然,直接复制保存。
注意事项
- 只用于找回自己遗忘密码的文件,破解他人加密文件可能违法。
- 密码字典不要太大,几万个密码试一个包就要很久,建议先整理自己常用的密码段。
- AES加密的ZIP在Python标准库zipfile里支持有限,老格式ZipCrypto兼容性最好。
- 7z、RAR格式标准库不支持,需要装
py7zr、rarfile等第三方库,本篇不涉及。

更新时间:2026-09-14 21:20:49