permissionerror: [errno 13] 表示操作系统拒绝访问,主因是文件被其他进程占用或权限不足;常见于excel/wps后台残留、预览窗格启用、只读属性、临时文件未清理及句柄未释放。

PermissionError: [Errno 13] Permission denied 是什么信号
这不是代码写错了,是操作系统在喊“停手”——Python请求打开/读取/写入一个文件,但Windows/Linux内核拒绝了该请求。错误码[Errno 13]明确指向权限不足或资源被锁死,和语法、逻辑无关。
文件被其他进程占用是最常见原因(尤其 Windows)
你“看着没打开”,不代表系统认为它空闲。Excel、WPS、资源管理器预览窗格、OneDrive同步进程、甚至缩略图生成器都可能悄悄持有文件句柄。
- 用任务管理器结束所有
EXCEL.EXE、WPS.exe进程(注意后台常驻项) - 关掉资源管理器的“预览窗格”:查看 → 预览窗格(取消勾选)
- 快速验证是否被占:PowerShell 中运行
Get-Process | Where-Object { $_.Modules.FileName -like "*your_file.xlsx*" } - 别信“我刚关了Excel”——WPS 后台服务常残留锁定,强制结束更可靠
openpyxl/pandas 默认申请写权限,哪怕你只读
openpyxl.load_workbook() 默认以读写模式打开,会尝试获取文件写锁。如果文件属性设为“只读”,或目录无写权限,立刻触发PermissionError: [Errno 13]。
- 右键文件 → 属性 → 取消勾选“只读”
- 确认目标目录有写权限(避开
C:\Program Files、C:\Windows等系统路径) - 纯读取场景改用:
load_workbook(filename, read_only=True),不申请写锁 - 用
pandas.read_excel()时也同理,底层仍调用openpyxl;若报错,优先试read_only=True参数(部分版本支持传入引擎选项)
临时文件残留和未释放句柄会持续引发问题
openpyxl保存时先写临时文件(如~$report.xlsx),再原子替换。程序异常退出会导致临时文件滞留,后续任何操作都可能因锁冲突失败。
- 手动清理当前目录下以
~$开头的临时文件 - 用
with语句确保ExcelWriter关闭:with pd.ExcelWriter(...) as writer: - PIL处理图片后必须显式调用
.close(),否则os.remove()必报[WinError 32] - 避免在循环中反复
open()同一文件却不close(),引用计数不归零,锁就一直挂着
真正麻烦的不是报错本身,而是它不告诉你谁在占着——得靠工具查、靠经验猜、靠重启清。别跳过进程排查直接改权限,那只是把锁从“别人拿着”换成“自己没钥匙”。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











