仓库:MuZiCul/FileCompression(原创)· 语言:Python (pyminizip) · 定位:递归压缩目录为带密码的 ZIP
一个简单实用的 Python 工具:把整个目录(含所有子文件夹)递归压缩成一个带密码保护的 ZIP 文件。
import os
import pyminizip
def zipdir(path, zipname, password):
# 收集所有文件(含子文件夹)
file_paths = []
relative_paths = []
filenames = []
for root, dirs, files in os.walk(path):
for file in files:
filenames.append(os.path.basename(file))
full_path = os.path.join(root, file)
relative_path = os.path.relpath(full_path, path)
file_paths.append(full_path)
relative_paths.append(relative_path)
# 关键处理:解决"倒数第二层文件夹被当作文件名"的问题
for i in range(len(filenames)):
if filenames[i] in relative_paths[i]:
relative_paths[i] = relative_paths[i].replace(filenames[i], '')
# 使用 pyminizip 压缩(路径、文件名、输出、密码、压缩级别)
pyminizip.compress_multiple(file_paths, relative_paths, zipname, password, 5)
Python 标准库 zipfile 只能解压加密 ZIP,不能创建加密 ZIP。要生成带密码的 ZIP,需要:
- 调用系统 zip -P(依赖外部命令)
- 或使用 pyminizip(基于 zlib/minizip 的 Python 绑定)✅
pyminizip.compress_multiple() 需要两个列表:文件的绝对路径 + ZIP 内的相对路径。
代码里那段"倒数第二层文件夹为文件名"的修复逻辑,是在处理 os.path.relpath 产生的路径与文件名重复的情况——确保 ZIP 内部目录结构正确,不会出现 folder/folder 的冗余层级。
pyminizip.compress_multiple(..., 5) 最后的参数 5 是压缩级别(0-9),5 是速度与压缩率的平衡点。
直接运行(修改 main.py 底部配置):
dir_to_zip = './ttg/' # 要压缩的文件夹
zip_file_name = './zip/your_zip_file.zip' # 输出文件
password = '123456' # 解压密码
zipdir(dir_to_zip, zip_file_name, password)
作为模块导入:
from main import zipdir
zipdir('./your_folder/', './output.zip', 'your_password')
./zip/ 需先建好,否则报错)工具虽小但封装干净:zipdir() 函数独立可复用,支持密码保护与递归子目录。两个值得注意的细节——底层的相对路径修复逻辑、以及对 pyminizip 的选型理由(标准库无法加密写入)。
我自己会把它嵌到备份脚本和打包流程里用。