使用os.rename()触发PermissionError权限拒绝问题求助
问题解决:os.rename() 权限拒绝错误(文件占用)
核心问题
取消采购请求时执行os.rename()重命名文件夹,触发PermissionError: [WinError 5] 访问被拒绝。手动通过资源管理器可正常重命名,账户拥有修改权限,且已尝试删除openpyxl工作簿对象,但问题依旧。
根本原因
del pasta仅删除变量引用,Python垃圾回收不会立即释放文件句柄,导致文件仍被程序占用;Windows系统对文件资源的释放存在延迟,手动删除对象无法保证即时释放。
解决步骤
1. 用上下文管理器(with语句)加载Excel文件
上下文管理器会在代码块结束后自动关闭文件,确保资源即时释放,替代不可靠的手动del操作。
2. 替换重复save操作,改用文件复制
原代码中用同一个工作簿对象保存到两个路径,易引发文件占用问题,改为修改本地文件后复制到目标路径更安全。
3. 强制触发垃圾回收(可选)
重命名前调用gc.collect(),强制回收未使用资源,确保文件句柄完全释放。
4. 检查隐性占用
若之前通过os.startfile()打开过Excel文件,需确保用户已关闭该文件,外部进程占用会导致文件夹无法重命名。
修改后的关键代码片段
import gc import shutil # ... 其他原有代码 ... if event == "Cancelar": if sg.popup_ok_cancel("Você tem certeza? Esta ação não poderá ser desfeita.", font=("Helvetica", 12, "bold"), background_color="yellow", title="Confirme") == "OK": ind = cycleThrough(caminho[0] + caminho[1], dic=True) local_excel = caminho[0] + caminho[1] suprimentos_excel = caminho_suprimentos + caminho[1] # 使用with语句加载并修改本地Excel,自动关闭文件 with openpyxl.load_workbook(local_excel) as pasta: if "Anexo" in pasta.sheetnames: aba = pasta["Anexo"] for linha in aba.iter_rows(min_col=ind[1]["Quantidade"][0], max_col=ind[1]["Quantidade"][0], min_row=ind[1]["Quantidade"][1], max_row=ind[1]["Quantidade"][1] + ind[1]["data_ends_at"] - 1): for celula in linha: celula.value = 0 elif "Formulário" in pasta.sheetnames: aba = pasta["Formulário"] for linha in aba.iter_rows(min_col=2, max_col=2, min_row=15, max_row=ind[1]["data_ends_at"] + 1): for celula in linha: celula.value = 0 else: sg.popup("A requisição sendo editada não segue o padrão. Zere as quantidades manualmente.") pasta.save(local_excel) # 复制修改后的文件到目标路径,替代原重复save操作 shutil.copy(local_excel, suprimentos_excel) # 强制垃圾回收,确保文件资源完全释放 gc.collect() # 执行文件夹重命名 os.rename(caminho[0], caminho[0][:-1] + " - CANCELADA/") os.rename(caminho_suprimentos, caminho_suprimentos[:-1] + " - CANCELADA/") sg.popup("Requisição Cancelada") break
额外建议
- 可在重命名前添加短暂延迟(如
time.sleep(0.5)),给Windows系统足够时间释放文件资源。 - 检查路径拼接是否正确,确保
caminho[0]和caminho_suprimentos末尾的斜杠处理一致,避免路径错误。
内容的提问来源于stack exchange,提问作者Jean Alves
相关产品推荐
相关产品推荐

