Python:从CSV文件和打印报告中读取记录

时间:2018-05-07 14:43:08

标签: python-3.x

我一直在制作一个星期的节目,但根据指南无法让它工作。

在这个程序( payroll.py )中,我必须打开CSV数据文件( employees.csv ),读取文件中的记录,然后生成一个使用payroll.py中的功能的工资核算报告。输出应打印写入单独的输出文件,最终应如下所示:

LastName    FirstName    Hours    RegHours    OTHours    RegPay    OTPay    GrossPay    Deductions    NetPay
Hightower   Michael      42.0     40.0        2.0        400.00    30.00    430.00      107.07        322.93
Jackson     Samuel       53.0     40.0        13.0       506.00    246.68   752.67      187.42        565.25
Jones       Catherine    35.0     35.0        0.00       680.05    0.00     680.05      169.33        510.72

工资单程序可以自行运行(不调用CSV文件),但是当我尝试调用该文件时(使用“来自csv import reader ”),会发生以下两种情况之一:

1)我可以调用前三列(姓氏,名字和小时),但我无法“插入”其他列(我得到索引错误,因为,当然,这些列不存在于原始CSV文件中)或

2)程序只会提取一整条记录,这恰好是CSV文件中的最后一条记录。

非常感谢任何关于如何实现这一目标的指导。谢谢。

以下是 payroll.py 的代码:

def main() :
    employeeFirstName, employeeLastName = employeeFullName()
    employeePayRate, employeeHoursWorked = employeePay()
    employeeRegularHours, employeeOvertimeHours = calculateRegularHours(employeeHoursWorked)
    employeeOvertimeHours = calculateOvertimeHours(employeeHoursWorked)
    employeeTotalHours = calculateTotalHours(employeeRegularHours, employeeOvertimeHours)
    regularPayAmount = calculateRegularPay(employeePayRate, employeeRegularHours)
    overtimePayAmount = calculateOvertimePay(employeePayRate, employeeOvertimeHours)
    grossPayAmount = calculateGrossPay(regularPayAmount, overtimePayAmount)
    federalTaxWithheld = calculateFederalTax(grossPayAmount)
    stateTaxWithheld = calculateStateTax(grossPayAmount)
    medicareTaxWithheld = calculateMedicareTax(grossPayAmount)
    socSecTaxWithheld = calculateSocSecTax(grossPayAmount)
    totalTaxesWithheld = calculateTotalTaxes(federalTaxWithheld, stateTaxWithheld, medicareTaxWithheld, socSecTaxWithheld)
    netPayAmount = calculateNetPay(grossPayAmount, totalTaxesWithheld)
    payrollSummaryReport(employeeFirstName, employeeLastName, employeePayRate, employeeRegularHours, employeeOvertimeHours, employeeTotalHours, regularPayAmount, overtimePayAmount, grossPayAmount, federalTaxWithheld, stateTaxWithheld, medicareTaxWithheld, socSecTaxWithheld, totalTaxesWithheld, netPayAmount)

def employeeFullName() :
    employeeFirstName = str(input("Enter the employee's first name: "))
    employeeLastName = str(input("Enter the employee's last name: "))
    return employeeFirstName, employeeLastName

def employeePay() :
    employeePayRate = float(input("Enter the employee's hourly pay rate: "))
    employeeHoursWorked = float(input("Enter the employee's hours worked: "))
    return employeePayRate, employeeHoursWorked

def calculateRegularHours(employeeHoursWorked) :
    if employeeHoursWorked < 40 :
        employeeRegularHours = employeeHoursWorked
        employeeOvertimeHours = 0

    else:
        employeeRegularHours = 40
        employeeOvertimeHours = employeeHoursWorked - 40

    return employeeRegularHours, employeeOvertimeHours

def calculateOvertimeHours(employeeHoursWorked) :
    if employeeHoursWorked > 40 :
        employeeOvertimeHours = employeeHoursWorked - 40

    else :
        employeeOvertimeHours = 0

    return employeeOvertimeHours

def calculateTotalHours(employeeRegularHours, employeeOvertimeHours) :
    employeeTotalHours = employeeRegularHours + employeeOvertimeHours
    return employeeTotalHours

def calculateRegularPay(employeePayRate, employeeHoursWorked) :
    regularPayAmount = employeePayRate * employeeHoursWorked
    return regularPayAmount

def calculateOvertimePay(employeePayRate, employeeOvertimeHours) :
    overtimePayRate = 1.5
    overtimePayAmount = (employeePayRate * employeeOvertimeHours) * overtimePayRate
    return overtimePayAmount

def calculateGrossPay(regularPayAmount, overtimePayAmount) :
    grossPayAmount = regularPayAmount + overtimePayAmount
    return grossPayAmount

def calculateFederalTax(grossPayAmount) :
    federalTaxRate = 0.124
    federalTaxWithheld = grossPayAmount * federalTaxRate
    return federalTaxWithheld

def calculateStateTax(grossPayAmount) :
    stateTaxRate = 0.049
    stateTaxWithheld = grossPayAmount * stateTaxRate
    return stateTaxWithheld

def calculateMedicareTax(grossPayAmount) :
    medicareTaxRate = 0.014
    medicareTaxWithheld = grossPayAmount * medicareTaxRate
    return medicareTaxWithheld

def calculateSocSecTax(grossPayAmount) :
    socSecTaxRate = 0.062
    socSecTaxWithheld = grossPayAmount * socSecTaxRate
    return socSecTaxWithheld

def calculateTotalTaxes(federalTaxWithheld, stateTaxWithheld, medicareTaxWithheld, socSecTaxWithheld) :
    totalTaxesWithheld = federalTaxWithheld + stateTaxWithheld + medicareTaxWithheld + socSecTaxWithheld
    return totalTaxesWithheld

def calculateNetPay(grossPayAmount, totalTaxesWithheld) :
    netPayAmount = grossPayAmount - totalTaxesWithheld
    return netPayAmount

def payrollSummaryReport(employeeFirstName, employeeLastName, employeePayRate, employeeRegularHours, employeeOvertimeHours, employeeTotalHours, regularPayAmount, overtimePayAmount, grossPayAmount, federalTaxWithheld, stateTaxWithheld, medicareTaxWithheld, socSecTaxWithheld, totalTaxesWithheld, netPayAmount) :
    print()
    print("\t\t\t\t\t\tPayroll Summary Report")
    print()
    print("%-12s%-12s%-8s%-10s%-10s%-12s%-10s%-11s%-13s%-10s" % ("LastName", "FirstName", "Hours", "RegHours", "OTHours", "RegPay", "OTPay", "GrossPay", "Deductions", "NetPay"))
    print("%-12s%-12s%-8.2f%-10.2f%-10.2f$%-11.2f$%-9.2f$%-10.2f$%-12.2f$%-10.2f" % (employeeLastName, employeeFirstName, employeeTotalHours, employeeRegularHours, employeeOvertimeHours, regularPayAmount, overtimePayAmount, grossPayAmount, totalTaxesWithheld, netPayAmount))

main ()

我需要使用的CSV文件( employees.csv )如下所示:

First,Last,Hours,Pay
Matthew,Hightower,42,10
Samuel,Jackson,53,12.65
Catherine,Jones,35,19.43
Charlton,Heston,52,10
Karen,Black,40,12
Sid,Caesar,38,15
George,Kennedy,25,35
Linda,Blair,42,18.6
Beverly,Garland,63,10
Jerry,Stiller,52,15
Efrem,Zimbalist,34,16
Linda,Harrison,24,14
Erik,Estrada,41,15.5
Myrna,Loy,40,14.23

1 个答案:

答案 0 :(得分:0)

您可以将.csv文件视为常规文件。无需reader。这是一个可能处理您的文件的函数:

 def get_data(fname):
  ''' 
    Function returns the dictionary with following 
    format:
    { 0 : {
        "fname": "...",
        "lname": "...",
        "gross": "...",
      },
      1 : {
        ....,
        ,,,,
      },
    }
  '''
  result = {} # return value 
  i = 0 # you can zip range() if you want to
  with open(fname, 'r') as f: 
    for line in f.readlines()[1:]:
      result[i] = {}
      tmp = line.split(",") # list of values from file 
      # access file values by their index, e.g. 
      # tmp[0] -> first name
      # tmp[1] -> last name
      # tmp[2] -> hours
      # tmp[3] -> pay rate

      # do calculations using your functions (calculateOvertimePay,
      # calculateTotalHours, etc.) and store the results in dictionary
      # e.g: 
      result[i]["fname"] = tmp[0]
      result[i]["lname"] = tmp[1]
      # ...
      # do calculations for report
      # ...
      # result[i]["regular"] = calc...(....)
      # result[i]["overtime"] = calc...(....)
      result[i]["gross"] = calculateGrossPay(result[i]["regular"], result[i]["overtime"])
      i += 1
    return result

您可能希望使用payrollSummaryReport(...)功能来改善它:

  • dictlist
  • 替换您的巨大参数列表
  • 修改它以满足您的要求

你可能会以这种方式做出改进:

def payrollSummaryReport(vals) :
    print()
    print("\t\t\t\t\t\tPayroll Summary Report")
    print()
    print("%-12s%-12s%-8s%-10s%-10s%-12s%-10s%-11s%-13s%-10s" %\
     ("LastName", "FirstName", "Hours", "RegHours", "OTHours", "RegPay", "OTPay", "GrossPay", "Deductions", "NetPay"))
    for i in vals:
      print("%-12s%-12s%-8.2f%-10.2f%-10.2f$%-11.2f$%-9.2f$%-10.2f$%-12.2f$%-10.2f" %\
       (vals[i]["fname"], vals[i]["lname"], vals[i]["gross"], ''' repeat for all fields '''))