
每月要把 12 个月的凭证打包归档;客户发来 50 个 zip 要批量解开。
手动右键压缩?zipfile 标准库就够了,都不用装东西。
一、批量压缩文件夹
import zipfile, os, glob
def zip_dir(src, out):
with zipfile.ZipFile(out, "w", zipfile.ZIP_DEFLATED, compresslevel=6) as z:
for root, dirs, files in os.walk(src):
for f in files:
full = os.path.join(root, f)
arc = os.path.relpath(full, src) # 保持相对目录结构
z.write(full, arc)
print("+", arc)
for d in glob.glob("凭证/*"):
zip_dir(d, f"归档/{os.path.basename(d)}.zip")
二、批量解压
import zipfile, os
def unzip(path, dst):
os.makedirs(dst, exist_ok=True)
with zipfile.ZipFile(path) as z:
for info in z.infolist():
# 中文文件名修复(Windows 用 cp437 编码了名字)
name = info.filename
try:
name = name.encode("cp437").decode("gbk")
except (UnicodeEncodeError, UnicodeDecodeError):
try:
name = name.encode("cp437").decode("utf-8")
except Exception:
pass
target = os.path.join(dst, name)
if not os.path.abspath(target).startswith(os.path.abspath(dst)):
continue # 防 Zip Slip 路径穿越
os.makedirs(os.path.dirname(target), exist_ok=True)
if not info.is_dir():
with z.open(info) as s, open(target, "wb") as t:
t.write(s.read())
for f in glob.glob("收件/*.zip"):
unzip(f, f"解开/{os.path.basename(f)[:-4]}")
三、加密压缩包
zipfile 只能解密不能加密,加密用:
# pip install pyminizip
import pyminizip
pyminizip.compress("工资表.xlsx", None, "工资表.zip", "密码123", 6)
或者调用系统 7-Zip:
import subprocess
subprocess.run([r"C:\Program Files\7-Zip\7z.exe", "a", "-p密码123",
"-mx=9", "归档.7z", r"D:\数据\*"], check=True)
四、分卷压缩(大文件拆成 100MB 一份)
subprocess.run([r"C:\Program Files\7-Zip\7z.exe", "a", "-v100m",
"大文件.7z", "原始数据.mov"], check=True)
五、压缩前先看内容(不解压)
with zipfile.ZipFile("a.zip") as z:
for i in z.infolist():
print(f"{i.filename} {i.file_size/1024:.0f}KB -> {i.compress_size/1024:.0f}KB")
六、常见坑
• 中文文件名乱码:Windows 下生成的 zip 文件名用 cp437 编码,解压时按上面代码转 gbk/utf-8。
• Zip Slip 漏洞:解压别人给的 zip 必须校验目标路径在解压目录内,否则可能被写入任意位置。
• ZIP_DEFLATED 需要 compresslevel:Python 3.7+ 才支持,低版本去掉这个参数。
• 已经压缩过的文件别再压:jpg/mp4/zip 再压基本不减体积,还白费 CPU。
• 大文件内存:上面用 shutil.copyfileobj 流式写更省内存。
with z.open(info) as s, open(target, "wb") as t:
import shutil
shutil.copyfileobj(s, t, length=1024*1024)
七、进阶:按日期归档日志
import datetime, shutil
month = datetime.date.today().strftime("%Y-%m")
shutil.make_archive(f"logs_{month}", "zip", "logs") # 一行搞定
shutil.unpack_archive("logs_2026-08.zip", "解出/") # 解压也一行
小结
简单场景用 shutil.make_archive 一行;要控制结构/中文名用 zipfile;加密分卷上 7-Zip。别重复造轮子。
以上就是“Python 办公:批量压缩、解压、加密、分卷,一条命令搞定!”的详细内容,想要了解更多Python教程欢迎持续关注编程学习网。
扫码二维码 获取免费视频学习资料

- 本文固定链接: http://www.phpxs.com/post/14513/
- 转载请注明:转载必须在正文中标注并保留原文链接
- 扫码: 扫上方二维码获取免费视频资料