根本原因是文件被其他进程独占占用,如excel/wps程序、预览窗格、onedrive或杀毒软件;需关闭相关进程、禁用预览、检查只读属性、使用只读模式加载、避免直接覆盖打开的文件,并优先选用无excel依赖的库。

Python写Excel时抛出PermissionError: [Errno 13] Permission denied
根本原因几乎总是文件正被其他进程独占打开——比如Excel桌面程序、WPS、预览窗口、甚至资源管理器缩略图生成器。Python的pandas.to_excel()、openpyxl.load_workbook()或xlwings.App().books.open()在尝试写入时,操作系统直接拒绝访问,不是代码写错了。
- 先关闭所有Excel相关窗口(包括后台隐藏的Excel进程,任务管理器里查
EXCEL.EXE) - 检查文件是否被Windows资源管理器“预览窗格”占用:关掉预览窗格再试
- 用命令行快速验证:
handle.exe your_file.xlsx(需Sysinternals工具),或 PowerShell 中运行Get-Process | Where-Object { $_.Modules.FileName -like "*your_file.xlsx*" } - 别依赖“看起来没打开”——WPS常驻后台且静默锁定文件,强制结束WPS进程更可靠
openpyxl加载xlsx报PermissionError但文件明明没打开
openpyxl默认以读写模式打开文件,哪怕你只读也申请写权限。如果文件属性设为“只读”,或所在目录无写权限,就会触发PermissionError,错误信息里通常带[Errno 13]。
- 检查文件属性:右键 → 属性 → 取消勾选“只读”
- 确认Python进程有目标目录的写权限(尤其在C:\Program Files或受控企业环境)
- 改用只读模式加载:
load_workbook(filename, read_only=True),此时不申请写锁,适合纯读取场景 - 若必须写入,确保路径是用户文档目录(如
os.path.expanduser("~/Documents")),避开系统保护路径
pandas.to_excel()保存失败,提示PermissionError: [WinError 32]
[WinError 32]是Windows特有错误码,明确表示“进程无法访问文件,因为另一进程正在使用此文件”。和前面不同,这里大概率是目标文件正被打开,且pandas试图覆盖原文件。
- 不要让
to_excel()直接覆盖正在打开的文件;改用临时文件名保存,再手动替换:df.to_excel("temp.xlsx"); os.replace("temp.xlsx", "report.xlsx") - 加异常捕获并提示用户:“请关闭Excel中打开的report.xlsx后再运行”
- 避免路径含中文或空格(虽不直接导致PermissionError,但会干扰某些底层库的文件句柄处理)
- 如果用
ExcelWriter,确保显式调用writer.close()或用with语句,否则文件句柄可能未释放
用xlwings操作Excel时卡住并报PermissionError
xlwings底层调用COM接口,它不仅需要文件不被占用,还要求Excel应用本身处于可响应状态。一旦Excel弹出模态对话框(如“发现不可读内容”提示)、或卡在加载插件,xlwings.App().books.open()就可能超时后抛出权限类错误。
- 启动Excel时禁用加载项:
app = xlwings.App(add_book=False, visible=False); app.api.Application.AutomationSecurity = 3 - 打开前先检查Excel是否已存在且空闲:
try: app.books[0].name except: pass,再open - 关键:Windows下
xlwings不能跨用户会话操作Excel(比如服务账户跑脚本去操作交互式用户的Excel),这是系统级限制,无绕过方法 - 若只需读数据,优先用
openpyxl或pandas.read_excel(),它们不依赖Excel进程
真正棘手的PermissionError往往藏在“看不见的占用”里——比如OneDrive同步中、杀毒软件实时扫描、甚至IDE自带的Excel预览插件。动手前先用Process Explorer查句柄,比反复改代码高效得多。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











