You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:28:27