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

Python实现:查找并解压子文件夹压缩包后删除原文件

问题分析与解决方案

嘿,你的整体实现思路是合理的——遍历目录树查找所有zip文件、解压到同名子文件夹的逻辑没问题,访问被拒的核心原因是你没有正确关闭ZipFile对象,导致原压缩包文件被Python进程锁定,无法删除。

为什么会出现访问被拒?

当你直接用zipfile.ZipFile(os.path.join(root, filename)).extractall(...)这种写法时,ZipFile对象虽然完成了解压操作,但Python并不会立刻释放对该文件的占用(垃圾回收机制不会即时触发),此时系统会认为文件还在被使用,所以执行删除操作时会报错。

解决方法:确保ZipFile对象被正确关闭

有两种可靠的方式来处理这个问题:

方法1:使用上下文管理器(推荐)

用with语句创建ZipFile对象,它会在代码块执行完毕后自动关闭文件,释放资源:

import zipfile, fnmatch, os

rootPath = r"."
pattern = '*.zip'

for root, dirs, files in os.walk(rootPath):
    for filename in fnmatch.filter(files, pattern):
        zip_path = os.path.join(root, filename)
        extract_dir = os.path.join(root, os.path.splitext(filename)[0])
        print(f"处理文件:{zip_path}")
        
        # 使用with语句自动管理ZipFile资源
        with zipfile.ZipFile(zip_path, 'r') as zip_ref:
            zip_ref.extractall(extract_dir)
        
        # 现在可以安全删除原压缩包了
        os.remove(zip_path)

方法2:手动调用close()方法

如果你不想用with,也可以手动创建ZipFile对象,完成解压后调用close()释放资源:

import zipfile, fnmatch, os

rootPath = r"."
pattern = '*.zip'

for root, dirs, files in os.walk(rootPath):
    for filename in fnmatch.filter(files, pattern):
        zip_path = os.path.join(root, filename)
        extract_dir = os.path.join(root, os.path.splitext(filename)[0])
        print(f"处理文件:{zip_path}")
        
        zip_ref = zipfile.ZipFile(zip_path, 'r')
        zip_ref.extractall(extract_dir)
        # 手动关闭文件句柄
        zip_ref.close()
        
        # 执行删除
        os.remove(zip_path)

额外注意事项

  • 确保你有目标文件夹的读写权限,如果解压路径是系统保护目录(比如C:\Windows),可能还是会有权限问题;
  • 检查压缩包是否被其他程序占用(比如资源管理器正打开该文件),这种情况即使关闭了ZipFile对象也无法删除;
  • 如果zip文件解压后出现同名文件,默认会覆盖,如果你需要避免覆盖,可以在解压前判断目标目录是否存在,做相应处理。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 04:18:36