如何基于输入搜索值获取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
相关产品推荐
相关产品推荐

