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

