如何在 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
我想在 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