python-mini-projects 之 Extract_zip_files:用 Python 标准库实现 ZIP 批量解压 CLI 工具
2026/9/20 16:28:09 网站建设 项目流程

python-mini-projects 之 Extract_zip_files:用 Python 标准库实现 ZIP 批量解压 CLI 工具

【免费下载链接】python-mini-projectsA collection of simple python mini projects to enhance your python skills项目地址: https://gitcode.com/gh_mirrors/py/python-mini-projects

本指南围绕 python-mini-projects 仓库中的 Extract_zip_files 模块展开,讲解如何仅用 Python 标准库(zipfileargparseossys)编写一个"一行命令解压 ZIP"的小工具。读者学完后,不仅能直接复现该工具的全部功能,还能理解其参数解析、文件校验与解压落盘的核心实现,并掌握安全使用zipfile.extractall()的注意事项。

模块定位:一条命令完成 ZIP 解压

在仓库根目录 README.md 的项目列表中,Zip File Extractor 被列为第 72 号迷你项目。它的职责非常聚焦:接收一个 ZIP 文件路径作为命令行参数,将其全部内容解压到以该 ZIP 文件名命名的独立文件夹中,且文件夹创建在脚本当前所在目录

例如输入Amazing_Spiderman_subtitles.zip,脚本会在当前目录生成Amazing_Spiderman_subtitles/文件夹,并将压缩包内的所有文件释放到其中。整个模块只有两个文件:

  • projects/Extract_zip_files/README.md:使用说明
  • projects/Extract_zip_files/extract_zip_files.py:完整实现(约 35 行)

运行环境与依赖

该脚本只依赖 Python 标准库,不需要任何第三方包,无需pip install。实现中用到的模块及作用如下:

模块作用使用位置
os判断文件是否存在、获取当前工作目录extract_zip_files.py
zipfile打开 ZIP 并执行解压(核心)extract_zip_files.py
sys文件不存在时终止程序并输出错误信息extract_zip_files.py
argparse解析命令行参数-l/--zippedfileextract_zip_files.py

快速上手:使用方式与命令行参数

原文档给出了最简洁的使用方式,在终端(命令行提示符)中直接运行:

python extract_zip_files.py -l <Your zip file>

实际示例:

python extract_zip_files.py -l Amazing_Spiderman_subtitles.zip

运行成功后终端会输出Extracted successfully!!!,并在当前目录生成同名文件夹。

参数说明

脚本通过argparse.ArgumentParser定义一个必选参数,见 extract_zip_files.py:

parser = argparse.ArgumentParser() parser.add_argument("-l", "--zippedfile", required=True, help="Zipped file") args = vars(parser.parse_args())
选项全称是否必填含义
-l--zippedfile是(required=True待解压的 ZIP 文件路径

从源码结构可以推断以下行为:

  • 若运行时不带-l参数,argparse会直接报错退出并打印参数帮助信息(因为required=True);
  • -l--zippedfile等价,两种写法均可;
  • 参数值通过vars(parser.parse_args())转为字典后以args['zippedfile']取出,见 extract_zip_files.py。

源码解析:逐行拆解解压逻辑

完整实现位于 projects/Extract_zip_files/extract_zip_files.py,整体流程可分为三个阶段:参数解析 → 文件校验 → 解压落盘。

第一步:文件存在性校验

在进入解压逻辑前,脚本先确认用户指定的文件确实存在:

if os.path.exists(zip_file) == False: sys.exit("No such file present in the directory")

见 extract_zip_files.py。这里用os.path.exists()检查路径是否真实存在,不存在则调用sys.exit()打印错误信息并立即终止程序,避免后续zipfile.ZipFile打开不存在的文件时抛出底层异常。

第二步:extract 函数的核心解压流程

def extract(zip_file): file_name = zip_file.split(".zip")[0] if zip_file.endswith(".zip"): current_working_directory = os.getcwd() new_directory = current_working_directory + "/" + file_name with zipfile.ZipFile(zip_file, 'r') as zip_object: zip_object.extractall(new_directory) print("Extracted successfully!!!") else: print("Not a zip file")

见 extract_zip_files.py。关键点逐条说明:

  1. 目标目录命名(第 22 行):file_name = zip_file.split(".zip")[0],即取路径中第一个.zip之前的部分作为文件夹名。例如Amazing_Spiderman_subtitles.zip会得到Amazing_Spiderman_subtitles。这也验证了 README 中"文件夹与输入 ZIP 文件同名"的描述。
  2. 后缀校验(第 23 行):zip_file.endswith(".zip")确保只处理 ZIP 文件;若传入其他后缀(如.rar),则打印Not a zip file而不执行解压。
  3. 目标路径拼接(第 26-27 行):os.getcwd()获取脚本当前工作目录,再与文件夹名用/拼接,得到new_directory,即"解压到当前目录下的同名子文件夹"。
  4. 真正执行解压(第 29-30 行):zipfile.ZipFile(zip_file, 'r')以只读模式打开压缩包(with上下文管理器确保文件句柄正确关闭),随后zip_object.extractall(new_directory)将全部成员释放到目标目录。
  5. 成功提示(第 31 行):解压完成后打印Extracted successfully!!!

第三步:调用入口

脚本顶层(模块级)直接调用extract(zip_file)(见 第 35 行),没有if __name__ == "__main__":包裹,因此运行时即自动执行解压逻辑。这也意味着该文件以"直接运行"为主要使用方式,而非作为库被import

工作原理:zipfile 模块的读与解

zipfile是 Python 标准库中的 ZIP 档案处理模块。本脚本用到了它的两个关键 API:

  • zipfile.ZipFile(path, mode):构造 ZipFile 对象,mode='r'表示只读打开已有压缩包;
  • extractall(path):将压缩包内所有成员解压到指定目录,自动创建缺失的目录层级。

脚本采用with语句管理 ZipFile 对象,无论解压成功与否,文件句柄都会被安全关闭。这与仓库中另一模块 Write_script_to_compress_folder_and_files/zipfiles.py 的zip_dir函数形成对称:前者用ZipFile(dir_path + '.zip', 'w')写入压缩,后者用ZipFile(zip_file, 'r')读出解压,二者共同覆盖了"压缩/解压"两个方向。

边界情况与使用注意事项

从源码逻辑可以推断出以下边界行为,实际使用时需要注意:

  1. 文件名包含多个.zip字样:由于采用split(".zip")[0]而非replace(".zip", ""),对于类似archive.zip.bak.zip的文件名,目标文件夹会命名为archive(取第一个.zip之前的部分),与直觉中的"去掉后缀"可能不一致。
  2. .zip后缀文件:即使文件真实存在,只要后缀不是.zip,只会打印Not a zip file,不会做任何解压。
  3. 目标目录已存在extractall遇到目标目录已存在时会合并内容,重复解压会覆盖同名文件,脚本本身没有去重或覆盖保护。
  4. 安全性提醒:脚本直接调用extractall(),并未对压缩包内的成员路径做校验。从实现角度看,若解压来源不可信的 ZIP 文件,其中恶意构造的路径(如../)存在被extractall展开到目标目录之外的风险(业界称 Zip Slip)。仓库内的 Zip_Bruter/zipbruter.py 同样使用了extractall来处理加密 ZIP;如果需要加固本脚本,可以自行校验每个成员的filename后再解压——当然,这只是给读者的进阶建议,本仓库提供的原版实现并未包含该防护。
  5. 文件不存在:程序会以错误信息No such file present in the directory终止(sys.exit),退出码非 0,适合在自动化脚本中捕获。

仓库内的相关延伸

如果想进一步扩展,仓库中有两个与本模块强相关的兄弟项目可作对照学习:

  • Write_script_to_compress_folder_and_files:与"解压"相对,实现文件和目录的 ZIP 压缩,其中retrieve_file_pathsos.walk递归收集目录下所有文件路径;
  • Zip_Bruter:针对加密 ZIP 的密码爆破工具,通过多线程遍历词典并调用ZipFile.extractall(pwd=...)验证密码,展示了zipfile模块在加密场景下的用法。

小结

Extract_zip_files 是一个教科书级别的"小而全" CLI 迷你项目:用argparse完成参数解析、用os.path完成前置校验、用zipfile.ZipFile.extractall()完成核心解压,全部依赖均来自 Python 标准库。它清晰演示了标准库编写命令行工具的标准范式,读者既可以照抄其结构快速实现自己的批量解压脚本,也可以以此为起点深入zipfile模块的进阶能力(加密、压缩等级、流式读取等)。

如需再次查看原始说明,可参考 projects/Extract_zip_files/README.md。

【免费下载链接】python-mini-projectsA collection of simple python mini projects to enhance your python skills项目地址: https://gitcode.com/gh_mirrors/py/python-mini-projects

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询