如何在 Excel 文件已打开时无权限错误读取数据

7次阅读

如何在 Excel 文件已打开时无权限错误读取数据

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 才能重跑脚本”的低效流程,显著提升数据分析迭代效率。

text=ZqhQzanResources