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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 08:20:53