Python删除最后一个.zip文件时触发WinError 32问题求助
问题解决建议
错误根源
你的代码里有两个关键问题导致最后一个zip文件被占用无法删除:
- 多余的
z = zipfile.ZipFile(download_path + '\\' + filename)没有被关闭,这个文件对象会一直持有最后一个zip的句柄,直到Python垃圾回收,而此时删除操作已经触发 - 删除逻辑放在了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
相关产品推荐
相关产品推荐

