尝试在 pd.ExcelWriter 中捕获 PermissionError 以在关闭电子表格后调用函数

Try Catch for PermissionError in pd.ExcelWriter to recall function after closing spreadsheet

我有一个接受 DataFrame 并创建电子表格的函数。

def createSpreadsheet(data):
    with pd.ExcelWriter('Output.xlsx', mode='w') as writer:
        data.to_excel(writer, sheet_name='Similarities')

我经常使用这个程序,并不总是记得关闭以前的 Output.xlsx 文件 - 当我让它打开时,我收到以下错误:PermissionError: [Errno 13] Permission denied: 'Output.xlsx'

我想添加一个 try/catch 来捕获创建 "Output_copy.xlsx" 的 PermissionError,或者更好的是,提示说 "Close the Output spreadsheet and press enter" 然后调用函数。我尝试了以下但我仍然遇到错误(我也尝试使用 except 子句但没有指定错误无济于事):

import pandas as pd
import openpyxl

def createSpreadsheet(data):
    try:
        with pd.ExcelWriter('Output.xlsx', mode='w') as writer:
            data.to_excel(writer, sheet_name='Similarities')
    except PermissionError:
        input("Close the spreadsheet and press enter.")
        createSpreadsheet(data)

很高兴收到任何帮助。

要捕获的异常取决于您使用的引擎。由于您没有在 pd.ExcelWriter 中指定引擎,因此将使用默认引擎。在您的情况下,这显然是 xlsxwriter

所以您有两个选择:要么指定 openpyxl 引擎并捕获 PermissionError,要么指定 xlsxwriter 引擎并捕获 xlsxwriter.exceptions.FileCreateError 错误:

try:
    with pd.ExcelWriter(r'c:\temp\Output.xlsx', engine='openpyxl', mode='w') as writer:
        df.to_excel(writer, sheet_name='Similarities')
except PermissionError:
    input("Close the spreadsheet and press enter.")

import xlsxwriter

try:
    with pd.ExcelWriter(r'c:\temp\Output.xlsx', engine='xlsxwriter', mode='w') as writer:
        df.to_excel(writer, sheet_name='Similarities')
except xlsxwriter.exceptions.FileCreateError:
    input("Close the spreadsheet and press enter.")

或者 - 为了安全起见 - 抓住两者(如果你安装了 xlsxwriter):

import xlsxwriter
try:
    with pd.ExcelWriter(r'c:\temp\Output.xlsx', mode='w') as writer:
        df.to_excel(writer, sheet_name='Similarities')
except (xlsxwriter.exceptions.FileCreateError, PermissionError):
    input("Close the spreadsheet and press enter.")

我通过在主程序中对 createSpreadsheet 函数的实际调用包装 try 和 except 来解决这个问题。

try:
    dm.createSpreadsheet(updateSimilaritySummaryDf)
except:
    input("Close the spreadsheet and try again...")
    dm.createSpreadsheet(updateSimilaritySummaryDf)