You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python使用ZipFile递归解压嵌套压缩包失效问题排查

问题根因

核心bug是路径拼接逻辑缺失:
调用listdir(path)返回的file只是纯文件名,不包含父目录路径。递归进入子目录后,脚本的当前工作目录仍然是初始执行的根目录,直接把纯文件名传给is_zipfile()和ZipFile()时,程序会在根目录下查找对应文件,自然找不到子目录内的嵌套压缩包,因此无法进入判断分支。
除此之外,原代码在for循环内部直接重写了外层的path变量,同目录下如果存在多个压缩包,会出现路径遍历错乱的问题。

对应你场景的实际执行逻辑:第一次执行时根目录下的Great grandfather.zip和当前工作目录匹配,所以能正常解压;递归进入解压生成的Great grandfather目录时,listdir拿到的文件名是Grandfather.zip,但程序实际查找的路径是根目录下的./Grandfather.zip,这个文件根本不存在,is_zipfile自然返回False。

修复后可直接运行的代码
from os import listdir
import os
from zipfile import ZipFile, is_zipfile

# 初始解压路径,默认为脚本当前所在目录
mypath = '.'

def extractor(path):
    for file in listdir(path):
        # 拼接生成文件的完整访问路径
        file_full_path = os.path.join(path, file)
        if is_zipfile(file_full_path):
            print(f"识别到压缩包: {file_full_path}")
            # 生成和压缩包同名的解压目标目录
            extract_target = os.path.splitext(file_full_path)[0]
            with ZipFile(file_full_path, 'r') as zipObj:
                zipObj.extractall(extract_target)
            # 递归处理解压后目录内的文件
            extractor(extract_target)

if __name__ == "__main__":
    extractor(mypath)
关键修复点
  • 所有文件访问操作统一用os.path.join()拼接父目录和文件名,生成准确的相对/绝对路径,彻底解决子目录文件找不到的问题
  • 移除循环内对外层path变量的重写逻辑,避免多压缩包场景下的路径遍历错误
  • 解压目标路径同样基于完整路径生成,不会出现解压文件错放到根目录的问题

内容的提问来源于stack exchange,提问作者Currymancer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 00:18:27