
当 excel 文件被其他程序(如 excel 应用本身)占用时,pandas 默认会因文件锁而报“permission denied”;通过启用 openpyxl 的 `read_only=true` 模式,可在不关闭文件的前提下安全读取只读数据。
在 Windows 系统中,当 Excel 文件处于打开状态(尤其开启自动保存时),操作系统会对该文件加独占读写锁。此时即使你仅使用 pandas.read_excel() 读取数据,底层引擎(默认为 openpyxl)也会尝试以读写模式打开 .xlsx 文件,从而触发权限拒绝错误——这正是你反复手动关闭 Excel 才能运行脚本的根本原因。
解决方法非常简洁:显式启用 openpyxl 的只读模式。pandas.read_excel() 支持 engine_kwargs 参数,可将 read_only=True 透传给 openpyxl.load_workbook()。这样 openpyxl 将跳过文件锁定检查,直接以流式方式解析 Excel 结构,大幅提升兼容性与鲁棒性。
✅ 正确用法示例:
import pandas as pd
# 即使 Excel 正在 UI 中打开,也能成功读取
df = pd.read_excel(
"data.xlsx",
engine="openpyxl", # 显式指定(可选,.xlsx 默认即此)
engine_kwargs={"read_only": True}
)
print(df.head())⚠️ 注意事项:
- 该方案仅适用于 .xlsx 文件(openpyxl 引擎);若处理 .xls,需改用 xlrd(旧版)或 pyxlsb(对 .xlsb),但它们不支持类似只读绕过机制,建议统一迁移到 .xlsx。
- read_only=True 会禁用单元格样式、公式计算结果缓存等高级功能,但不影响原始数值、文本、日期等核心数据的读取,完全满足常规数据分析需求。
- 无需复制文件、无需管理员权限、无需修改 Excel 设置(如关闭自动保存),零侵入、零副作用。
- 若仍报错,请确认未同时使用 xlwings 或 win32com 等可能持有 COM 锁的库——它们与 openpyxl 的只读模式不冲突,但自身可能引发独立锁定。
? 总结:这不是权宜之计,而是 openpyxl 官方推荐的生产级只读访问方式。将 engine_kwargs={"read_only": True} 加入你的 read_excel 调用,即可彻底告别“先关 Excel 再跑代码”的低效循环。










