Python读取文本文件匹配字典键:员工薪资计算仅输出最后一条记录排查
问题原因与修改方案
核心问题
computePayment方法内部遍历了HourInfo.txt的所有行,每次循环都会覆盖同一个结果字典的全部内容,循环结束后只会返回最后一行对应员工的计算结果- 原方法没有提供StaffID入参,无法指定要查询的目标员工
- 冗余遍历HourInfo文件,传入的
HoursWorked、date参数和文件读取的内容完全没有关联,属于无效逻辑
修改后的完整代码
class Employee: employdata = {} def __init__(self, StaffID, LastName, FirstName, RegHours, HourlyRate, OTMulti, TaxCredit, StandardBand): self.StaffID = StaffID self.LastName = LastName self.FirstName = FirstName self.RegHours = RegHours self.HourlyRate = HourlyRate self.OTMulti = OTMulti self.TaxCredit = TaxCredit self.StandardBand = StandardBand Employee.employdata[StaffID] = self @staticmethod def setup(employeeFile): with open(employeeFile) as newFile: for line in newFile: SI, LN, FN, RH, HR, OT, TC, SB = line.strip().split() # 统一把StaffID转为int,避免字符串和数字匹配失败 Employee(int(SI), LN, FN, int(RH), int(HR), float(OT), int(TC), int(SB)) @staticmethod def computePayment(staff_id, HoursWorked, date): # 直接根据传入的staff_id取对应员工信息,不需要遍历所有员工 if staff_id not in Employee.employdata: return {"error": "员工ID不存在"} emp = Employee.employdata[staff_id] d = {} d['StaffID'] = staff_id d['Hours Worked'] = HoursWorked d['Regular Hours Worked'] = emp.RegHours d['Regular Rate'] = emp.HourlyRate OTMulti = emp.OTMulti d['Tax Credit'] = emp.TaxCredit StandardBand = emp.StandardBand d['Date'] = date d['Name'] = emp.FirstName + ' ' + emp.LastName d['Regular Pay'] = d['Regular Rate'] * d['Regular Hours Worked'] if d['Hours Worked'] > d['Regular Hours Worked']: d['Overtime Hours Worked'] = d['Hours Worked'] - d['Regular Hours Worked'] else: d['Overtime Hours Worked'] = 0 d['OverTime Rate'] = int(d['Regular Rate'] * OTMulti) d['OverTime Pay'] = d['Overtime Hours Worked'] * d['OverTime Rate'] d['Gross Pay'] = d['Regular Pay'] + d['OverTime Pay'] d['Standard Rate Pay'] = StandardBand if d['Gross Pay'] > d['Standard Rate Pay']: d['Higher Rate Pay'] = d['Gross Pay'] - d['Standard Rate Pay'] else: d['Higher Rate Pay'] = 0 d['Standard Tax'] = int(d['Standard Rate Pay'] * 0.2) d['Higher Tax'] = round(d['Higher Rate Pay'] * 0.4, 2) d['Total Tax'] = round(d['Standard Tax'] + d['Higher Tax'], 2) d['Net Deduction'] = round(d['Total Tax'] - d['Tax Credit'], 2) d['Net Pay'] = round(d['Gross Pay'] - d['Net Deduction'], 2) return d # 加载所有员工数据 Employee.setup('Employee.txt') # 查询StaffID为54361的员工薪资 print(Employee.computePayment(54361, 42, '11/11/21')) # 查询StaffID为23513的员工薪资 print(Employee.computePayment(23513, 45, '11/11/21'))
补充说明
如果需要从HourInfo.txt自动读取对应员工的工时和日期,可以在computePayment中增加按staff_id筛选的逻辑,不需要遍历全部行:
@staticmethod def computePayment(staff_id): if staff_id not in Employee.employdata: return {"error": "员工ID不存在"} emp = Employee.employdata[staff_id] # 读取对应员工的工时记录 with open('HourInfo.txt') as f: for line in f: sid, date, hw = line.strip().split() if int(sid) == staff_id: HoursWorked = int(hw) break else: return {"error": "未找到该员工的工时记录"} # 后续计算逻辑和上面一致
内容的提问来源于stack exchange,提问作者jesus_guy
相关产品推荐
相关产品推荐

