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
相关产品推荐
相关产品推荐

