Python解压ZIP文件的三种实用技巧
作者:lxmyzzs
在日常开发,我们经常需要在 Linux 服务器或 Docker 容器中处理压缩包,本文总结了使用 Python 解压 ZIP 文件的三种常用方法,涵盖了从最简单的命令行操作到处理中文乱码的进阶技巧,大家可以根据需要进行选择
在日常开发,尤其是 AI 模型部署(如 YOLO、LLM 权重部署)中,我们经常需要在 Linux 服务器或 Docker 容器中处理压缩包。有时候容器里甚至没有安装 unzip 命令,这时候 Python 就成了我们的救命稻草。
本文总结了使用 Python 解压 ZIP 文件的三种常用方法,涵盖了从最简单的命令行操作到处理中文乱码的进阶技巧。
方法一:命令行“一行流” (最快、无需写脚本)
这是最简单、最快的方法。Python 标准库自带 zipfile 模块,可以直接在终端调用,无需编写任何 .py 文件。非常适合在 Docker 容器 或 临时环境 中使用。
语法:
python -m zipfile -e <压缩包名> <解压目标目录>
示例:
将 model_weights.zip 解压到当前目录(.):
python -m zipfile -e model_weights.zip .
原理:-m 参数将库模块当作脚本运行,-e 代表 extract(解压)。
方法二:标准库zipfile(基础脚本)
如果你需要在 Python 代码中集成解压功能,zipfile 是最标准的选择。建议使用 with 语句(上下文管理器),这样可以确保文件在使用后自动关闭,即使发生错误也不会占用文件句柄。
import zipfile
import os
def unzip_file(zip_src, dst_dir):
# 如果目标目录不存在,则创建
if not os.path.exists(dst_dir):
os.makedirs(dst_dir)
print(f"开始解压: {zip_src} ...")
try:
with zipfile.ZipFile(zip_src, 'r') as zfile:
# extractall 会解压所有文件
zfile.extractall(path=dst_dir)
print(f"✅ 解压完成,文件已保存至: {dst_dir}")
except zipfile.BadZipFile:
print("❌ 错误: 文件已损坏或不是有效的 ZIP 文件")
except Exception as e:
print(f"❌ 发生未知错误: {e}")
# 调用示例
if __name__ == "__main__":
unzip_file("merged_qwen3vl_model.zip", "./model_output")
方法三:进阶操作 (大文件进度条 + 中文乱码修复)
作为 AI 开发者,我们解压的模型往往高达几 GB 甚至几十 GB。如果没有进度条,对着黑屏傻等是非常焦虑的。此外,Windows 下打包的中文文件名在 Linux 下解压常会出现乱码。
下面的脚本解决了这两个痛点:
1. 依赖安装
我们需要 tqdm 来显示进度条(做 AI 的同学应该都有这个库):
pip install tqdm
2. 完整代码
import zipfile
import os
from tqdm import tqdm
def unzip_with_progress(zip_src, dst_dir):
if not os.path.exists(dst_dir):
os.makedirs(dst_dir)
with zipfile.ZipFile(zip_src, 'r') as zfile:
# 获取所有文件列表
members = zfile.infolist()
# 初始化进度条,total 是文件总大小
total_size = sum(file.file_size for file in members)
print(f"正在解压 {zip_src} 到 {dst_dir} ...")
with tqdm(total=total_size, unit='B', unit_scale=True, unit_divisor=1024) as pbar:
for member in members:
# --- 中文乱码修复核心代码 (可选) ---
# Windows 压缩包通常用 CP437 编码文件名,Linux 需要转回 GBK 或 UTF-8
try:
member.filename = member.filename.encode('cp437').decode('gbk')
except:
# 如果转换失败,保持原样(说明可能是 UTF-8)
pass
# --------------------------------
# 解压单个文件
zfile.extract(member, dst_dir)
# 更新进度条
pbar.update(member.file_size)
if __name__ == "__main__":
# 示例:解压一个大模型权重
unzip_with_progress("large_model_weights.zip", "./models")
总结
| 场景 | 推荐方法 | 核心命令/库 |
|---|---|---|
| 临时操作/Docker环境 | 方法一 | python -m zipfile -e file.zip . |
| 通用脚本开发 | 方法二 | import zipfile |
| 大文件/体验优化 | 方法三 | zipfile + tqdm |
到此这篇关于Python解压ZIP文件的三种实用技巧的文章就介绍到这了,更多相关Python解压ZIP文件内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
