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

调用TBXTools类遇AttributeError:无'cur'属性求助

排查AttributeError: 'TBXTools' has no attribute 'cur'问题

让我们一步步拆解这个错误的原因和解决办法:

核心问题分析

这个错误说明当你调用load_sl_corpus时,你的TBXTools实例e中并没有cur这个属性——而cur是数据库操作的游标,本该在初始化项目时被创建。

1. 你可能跳过了项目初始化步骤

从你贴出的create_project代码来看,self.cur是在这个方法里通过self.cur = self.conn.cursor()初始化的。如果在调用load_sl_corpus之前,你没有先调用create_project(或者open_project)来创建/打开项目并建立数据库连接,那self.cur根本就不存在,自然会抛出这个错误。

2. load_sl_corpus方法的实现可能有问题

你只贴出了load_sl_tl_corpus的代码,但你实际调用的是load_sl_corpus:

  • 如果你还没实现load_sl_corpus方法,那你可能是误调用了不存在的方法,或者应该改用load_sl_tl_corpus并传入两个语料文件参数;
  • 如果你已经实现了load_sl_corpus,要检查它的代码里是否正确依赖了self.cur,有没有像load_sl_tl_corpus那样使用数据库游标执行插入操作,以及是否确保self.cur已经被初始化。

3. 项目初始化可能失败了

create_project方法里有判断逻辑:如果项目文件已存在且没传overwrite=True,会抛出Exception("This file already exists")。如果这个异常被你忽略了(比如没有捕获),那后续的数据库连接和self.cur初始化步骤就不会执行,导致self.cur缺失。

具体解决步骤

  1. 确保调用顺序正确
    在加载语料之前,必须先完成项目初始化。比如:

    e = TBXTools()
    # 先创建/打开项目,初始化数据库连接和游标
    e.create_project("my_project.db", "en", overwrite=True)  # 根据需要调整参数
    # 再加载语料
    e.load_sl_corpus("Main corpus.txt")
    
  2. 检查load_sl_corpus的实现
    如果你需要单语料加载功能,参考load_sl_tl_corpus的逻辑实现load_sl_corpus,确保它使用self.cur执行数据库操作,并且依赖已初始化的数据库连接。比如:

    def load_sl_corpus(self, slcorpusfile, encoding="utf-8"):
        '''加载单语语料文件,每行一个片段'''
        self.slcf = codecs.open(slcorpusfile, "r", encoding=encoding)
        self.sl_data = []
        self.continserts = 0
        while True:
            self.sl_segment = self.slcf.readline()
            if not self.sl_segment:
                break
            self.continserts += 1
            self.max_id_corpus += 1
            self.sl_record = []
            self.sl_segment = self.sl_segment.rstrip()
            self.sl_record.append(self.max_id_corpus)
            self.sl_record.append(self.sl_segment)
            self.sl_data.append(self.sl_record)
            if self.continserts == self.maxinserts:
                self.cur.executemany("INSERT INTO sl_corpus (id, segment) VALUES (?,?)", self.sl_data)
                self.sl_data = []
                self.continserts = 0
        with self.conn:
            self.cur.executemany("INSERT INTO sl_corpus (id, segment) VALUES (?,?)", self.sl_data)
            self.conn.commit()
    

    (注意:要确保max_id_corpus、maxinserts这些属性也在初始化时被定义)

  3. 确认项目初始化没有异常
    在调用create_project时,加上异常捕获,确认它正常执行:

    try:
        e.create_project("my_project.db", "en")
    except Exception as err:
        print(f"项目初始化失败: {err}")
        # 根据错误提示调整参数,比如添加overwrite=True
    

额外小提示

你的create_project方法最后重复执行了self.cur = self.conn.cursor(),虽然不会导致当前错误,但可以去掉这个冗余代码,让逻辑更清晰。

内容的提问来源于stack exchange,提问作者Mohamed Abdel Aaal

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 09:09:40