编程学习网 > 编程语言 > Python > Python 办公:批量压缩、解压、加密、分卷,一条命令搞定!
2026
09-14

Python 办公:批量压缩、解压、加密、分卷,一条命令搞定!


每月要把 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 需要 compresslevelPython 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教程欢迎持续关注编程学习网。     

扫码二维码 获取免费视频学习资料

Python编程学习

查 看2022高级编程视频教程免费获取