使用Pandas+Xlsxwriter导出Excel遇[Errno 13]权限错误的异常处理求助
解决Xlsxwriter保存Excel时的权限拒绝异常问题
嘿,我完全懂你遇到的麻烦——当Excel文件被打开时,程序没法覆盖它,之前的异常处理没生效对吧?咱们一步步来搞定这个问题:
为什么你的尝试没成功?
首先得注意不同Python版本的异常类型差异:
- 在Python 3中,文件权限拒绝抛出的是
PermissionError(属于OSError的子类) - 在Python 2中才是
IOError
你的尝试1只捕获了IOError,如果是Python3环境就会失效;尝试2虽然捕获所有异常,但无限循环太粗暴,而且没给你手动关闭文件的缓冲时间。
改进后的解决方案
下面是更靠谱的代码,兼顾不同Python版本,还会提示你操作后重试:
import os import pandas as pd from time import sleep # 假设你已经有了要写入的数据df,以及company_code_choice变量 df = pd.DataFrame({'data': [1,2,3]}) company_code_choice = '2320' file_path = f"{company_code_choice}PLFY2018.xlsx" # 统一文件路径变量,避免重复输入 while True: try: # 用with语句管理writer,确保资源正确释放(可选,但更安全) with pd.ExcelWriter(file_path, engine='xlsxwriter') as writer: df.to_excel(writer, sheet_name='Sheet1') writer.save() # 部分版本中with语句会自动调用save,显式调用也没问题 # 保存成功后打开文件 os.startfile(file_path) print("报表生成并打开成功!") break # 成功后退出循环 except (PermissionError, IOError) as e: # 同时兼容Python3的PermissionError和Python2的IOError if e.errno == 13: print(f"权限错误:文件 {file_path} 正在被打开,请先关闭它!") print("关闭后按回车键重试...") input() # 等待用户确认关闭后再重试 else: # 其他异常直接抛出,方便排查问题 raise e except Exception as e: # 处理其他意料之外的异常 print(f"发生未知错误:{str(e)}") raise e
关键改进点说明
- 统一文件路径:把文件路径存成变量,避免重复拼写出错
- 兼容多Python版本:同时捕获两种权限异常类型,覆盖所有环境
- 等待用户确认:用
input()让程序暂停,等你关闭文件后再重试,不会无意义循环 - with语句管理writer:确保即使出现异常,文件资源也能正确释放,减少后续重试的障碍
额外小提示
如果还是遇到问题,可以检查:
- 确认文件确实没有被其他程序占用(比如邮件客户端、云同步工具也可能悄悄锁定文件)
- 保存路径是否有写入权限(尽量不要写到系统盘的受保护目录,比如
C:\Program Files)
内容的提问来源于stack exchange,提问作者Fabri
相关产品推荐
相关产品推荐

