PyQt5中Xlsxwriter重复运行报错,如何清理内存?
问题解决:重复调用爬虫函数出现Excel工作表重名错误
核心原因
你删除了本地旧Excel文件,但内存中的Workbook实例没有被销毁/重置。如果这个实例是全局变量、类的持久属性,第二次调用函数时会复用它,而该实例内部还记录着之前创建的工作表信息,自然会触发重名错误。
解决方案
1. 每次调用函数时创建新的Workbook实例
不要把Workbook对象定义为全局变量或类的初始化属性,而是在searchKeywords函数内部创建,使用完毕后立即关闭,让Python的垃圾回收机制清理内存。
2. 确保写入完成后关闭Workbook
xlsxwriter的Workbook必须调用close()方法才能完成文件写入,同时释放相关内存资源。
修正后的代码示例
import os import xlsxwriter from PyQt5.QtWidgets import QMainWindow, QPushButton class CrawlerWindow(QMainWindow): def __init__(self): super().__init__() self.init_ui() def init_ui(self): self.start_btn = QPushButton("启动爬虫", self) self.start_btn.clicked.connect(self.searchKeywords) self.setGeometry(300, 300, 300, 200) def searchKeywords(self): # 先清理旧文件(如果存在) excel_path = "result.xlsx" if os.path.exists(excel_path): os.remove(excel_path) # 每次都创建全新的Workbook实例 workbook = xlsxwriter.Workbook(excel_path) # 创建工作表(这里用你的目标表名) worksheet = workbook.add_worksheet('japanese katana') # -------------------- # 这里写你的爬取和写入逻辑 # 比如: worksheet.write('A1', '商品名称') worksheet.write('B1', '价格') # -------------------- # 必须关闭Workbook,完成写入并释放内存 workbook.close()
额外注意点
如果你的爬虫是放在子线程中执行的,要确保线程执行完毕后,Workbook对象被正确关闭,避免线程残留导致的内存泄漏。
内容的提问来源于stack exchange,提问作者malcom32
相关产品推荐
相关产品推荐

