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

Python删除最后一个.zip文件时触发WinError 32问题求助

问题解决建议

错误根源

你的代码里有两个关键问题导致最后一个zip文件被占用无法删除:

  1. 多余的z = zipfile.ZipFile(download_path + '\\' + filename)没有被关闭,这个文件对象会一直持有最后一个zip的句柄,直到Python垃圾回收,而此时删除操作已经触发
  2. 删除逻辑放在了for循环内部,每次循环都会尝试删除所有标记的文件,最后一次循环时,未关闭的文件句柄还没释放,导致删除失败

修复步骤

  • 移除那个未关闭的zipfile.ZipFile实例,改用with语句内的zObject获取压缩包内容列表
  • 将删除文件的逻辑移到整个for循环结束之后,确保所有zip文件操作都完成,文件句柄已释放
  • 用os.path.join统一处理路径拼接,避免硬编码\\带来的错误
  • 优化重试逻辑,增加短暂延时,提升删除成功率

修改后的完整代码

import os
import shutil
import time
import zipfile

def unzip(download_path, dir_path):
    num = 0
    bad_files = 0
    to_delete = []
    
    for filename in os.listdir(download_path):
        f = os.path.join(download_path, filename)
        
        if filename == "desktop.ini":
            pass
        elif filename.endswith(".zip"):
            # 仅用with语句操作zip文件,确保自动关闭
            with zipfile.ZipFile(f, 'r') as zObject:
                zObject.extractall(path=dir_path)
                # 从with内部获取namelist,避免额外实例化
                split_file = zObject.namelist()[0].split('/')[0]
            
            print(split_file)
            
            # 优化路径拼接
            original_extracted = os.path.join(dir_path, split_file)
            try:
                new_name = os.path.join(dir_path, f"{filename[:6]}.zip_{split_file}")
                os.rename(original_extracted, new_name)
            except:
                new_name = os.path.join(dir_path, f"error_duplicate_{split_file}")
                os.rename(original_extracted, new_name)
            
            to_delete.append(f)
            print(f"File {num + 1}")
        elif filename.endswith(".crdownload"):
            print(f"error: {filename}")
            bad_files += 1
            print(f"File {num + 1}")
        else:
            target_path = os.path.join(dir_path, filename)
            shutil.move(f, target_path)
            print(f"File {num + 1}")
        
        num += 1
        time.sleep(2)
    
    # 循环结束后统一删除文件,此时所有zip句柄已释放
    # 带重试的删除逻辑
    for _ in range(3):
        if not to_delete:
            break
        for file in to_delete.copy():
            try:
                os.remove(file)
                to_delete.remove(file)
            except PermissionError:
                time.sleep(1)  # 等待1秒后重试
    
    print(f"Bad files: {bad_files}")

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 02:15:27