
当 excel 文件被其他程序(如 excel 应用本身)占用时,pandas 默认会因文件锁而报“permission denied”;通过启用 openpyxl 的 `read_only=true` 模式,可在不关闭文件的前提下安全读取只读数据。
在 Windows 系统中,当 Excel 文件(尤其是启用了自动保存的 .xlsx 文件)正被 Excel 桌面应用打开时,操作系统会对该文件加独占读写锁。此时即使你仅使用 pandas 的 pd.read_excel() 进行只读操作,底层引擎(默认为 openpyxl)仍尝试以常规模式打开文件,从而触发权限拒绝错误。
解决方法非常简洁:显式启用 openpyxl 的只读模式。pandas 自 1.4.0 版本起支持通过 engine_kwargs 向底层引擎传递参数。只需在调用 read_excel 时添加:
import pandas as pd
df = pd.read_excel(
"data.xlsx",
engine="openpyxl", # 显式指定(可选,但推荐)
engine_kwargs={"read_only": True}
)✅ 优势说明:
- read_only=True 告知 openpyxl 绕过文件锁,以流式方式逐块加载数据,不尝试获取写权限;
- 完全兼容 .xlsx 格式(对 .xls 需使用 xlrd 引擎,但该引擎已弃用且不支持只读绕过);
- 无需复制/删除临时文件,避免 shutil.copyfile 失败(因源文件被锁定,复制操作本身也会报错);
- 不影响 Excel 端编辑——你在 Excel 中实时修改、保存后,下次运行脚本仍能读取最新内容(注意:需确保 Excel 已完成保存动作,自动保存可能有短暂延迟)。
⚠️ 注意事项:
- 此方案仅适用于读取场景;若需写入,请务必先关闭 Excel 或改用 openpyxl.load_workbook(..., read_only=False) 并手动处理锁冲突;
- 若未安装 openpyxl,请先执行 pip install openpyxl;
- 对于旧版 .xls 文件,请改用 engine="xlrd"(需 xlrd
总结:一行 engine_kwargs={"read_only": True} 即可彻底摆脱“必须手动关闭 Excel 才能重跑脚本”的低效流程,显著提升数据分析迭代效率。










