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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 05:06:03