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

如何基于输入搜索值获取employee.txt中特定员工对象详情?

问题分析与解决方案

错误根源

你打开empList = open("employee.txt")后,遍历for i in empList得到的是文本文件里的每一行字符串,不是Employee类的实例,所以自然没有surname属性,这就是AttributeError的直接原因。

修正步骤

1. 实现员工数据加载函数

先把文本文件里的字符串数据转换为Employee实例,才能正常访问类属性:

def load_employees():
    employees = []
    # 使用with语句自动管理文件资源,避免泄漏
    with open("employee.txt", "r") as f:
        for line in f:
            line = line.strip()
            if not line:  # 跳过空行
                continue
            # 按空格分割每行数据(注意:如果字段含空格,需改用逗号等分隔符)
            parts = line.split()
            # 对应写入顺序:empID, surname, forename, gender, phoneNum, DOB, email, houseNum, streetName, postcode, tc, county
            emp_id, surname, forename, gender, phone_num, dob, email, house_num, street_name, postcode, tc, county = parts
            # 创建Employee实例
            emp = Employee(surname, forename, gender, phone_num, dob, email, house_num, street_name, postcode, tc, county)
            emp.empID = emp_id  # 覆盖自动生成的ID,用文件中存储的
            employees.append(emp)
    return employees

2. 修改add_emp函数的搜索逻辑

加载所有员工实例后再进行匹配:

def add_emp():
    empSurname = txtSurname.get()
    empForename = txtForename.get()
    empPhone = txtPhone.get()
    empGender = comboGender.get()
    empDOB = txtDOB.get()
    empEmail = txtEmail.get()
    empHouseNum = txtHouseNum.get()
    empStreetName = txtStreetName.get()
    empTC = txtTc.get()
    empCounty = txtCounty.get()
    empPostcode = txtPostcode.get()

    # 添加新员工
    new_emp = Employee(empSurname, empForename, empGender, empPhone, empDOB, empEmail, empHouseNum, empStreetName, empPostcode, empTC, empCounty)

    # 加载所有员工并搜索匹配项
    emp_list = load_employees()
    for emp in emp_list:
        if emp.surname == empSurname:
            print(emp)  # 需要给Employee类添加__str__方法来格式化输出

3. 完善Employee类

修复未定义的employeeList变量,添加__str__方法方便打印信息:

class Employee():
    def __init__(self, surname, forename, gender, phoneNum, DOB, email, houseNum, streetName, postcode, tc, county):
        self.surname = surname
        self.forename = forename
        self.phoneNum = phoneNum
        self.DOB = DOB
        self.email = email
        self.houseNum = houseNum
        self.streetName = streetName
        self.postcode = postcode
        self.tc = tc
        self.county = county
       
        CAPL = self.surname.upper()
        CAPF = self.forename.upper()
    
        # 加载现有员工列表,用于生成唯一ID
        employeeList = load_employees()
        count = 1
        for i in employeeList:
            if i.empID[:4] == CAPL[:3] + CAPF[:1]:
                count += 1
            
        empID = CAPL[:3] + CAPF[:1] + str("{:02d}".format(count))
        self.empID = empID
    
        # 用with语句写入文件
        with open("employee.txt", "a") as employeeA:
            employeeA.write(f"{empID} {surname} {forename} {gender} {phoneNum} {DOB} {email} {houseNum} {streetName} {postcode} {tc} {county}\n")
    
    def __str__(self):
        # 自定义员工信息的打印格式
        return f"员工ID: {self.empID}\n姓名: {self.forename} {self.surname}\n电话: {self.phoneNum}\n邮箱: {self.email}\n地址: {self.houseNum} {self.streetName}, {self.postcode}, {self.county}"

4. 额外注意事项

  • 如果员工字段(比如地址)包含空格,split()会分割错误,建议改用逗号作为分隔符存储数据(写入时用f"{empID},{surname},...",读取时用line.split(','))
  • 每次添加新员工后重新加载列表,能保证搜索到最新数据

内容的提问来源于stack exchange,提问作者William Sutton

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 14:30:52