如何在 class 析构函数中关闭工作簿?

How to close workbook in class destructor?

我想在 class 实例销毁时隐式关闭工作簿。 xlsxwriter.workbook.py 方法说要明确地执行它然后它就起作用了。 但是在每个 Excel 文件创建脚本的末尾,我必须添加额外的行来关闭工作簿。有没有办法让它自动关闭?

import pandas as pd
import xlsxwriter

class ExcelFile():

def __init__(self, file_name):
    self.writer = pd.ExcelWriter(file_name, engine='xlsxwriter')
    self.workbook = self.writer.book

def __del__(self):
    self.workbook.close()
    print('del')

脚本:

e = ExcelFile('test.xlsx')
# e.workbook.close() <--This works but I don't want this line

您无法控制何时调用 __del__ 方法。 SO上已经有很多关于__del__的资料了,大家可以搜索一下(比如)。

相反,我会使用上下文管理器:

class ExcelFile():
    def __init__(self, file_name):
       self.writer = pd.ExcelWriter(file_name, engine='xlsxwriter')
       self.workbook = self.writer.book    

    def __enter__(self):
       return self

    def __exit__(self, exc_type, exc_val, exc_tb):
       print('exit')
       self.workbook.close()

with ExcelFile('test.xlsx') as e:
    # do whatever with e
    pass

输出将是:

'exit'

__exit__ 承诺在您退出 with ExcelFile(..) 块时调用,即使出现异常也是如此:

with ExcelFile('test.xlsx') as e:
    1/0

产出

Traceback (most recent call last):
  File "main.py", line 57, in <module>
    1/0
ZeroDivisionError: division by zero

exit