Откуда эта лишняя строка при печати элемента из набора? (CSV) файл с использованием Python и Spyder4 - PullRequest
0 голосов
/ 08 мая 2020

Меня смущает моя функция print (tmp [3]) элемента в наборе. Когда печатается элемент tmp [3], он дает мне две строки: одна со значением, а другая пустая. Все работает до строки 132.

Цель программы - напечатать сводный отчет о заработной плате, основанный на информации из предыдущих программ (с разными ставками). Вы должны использовать отдельные функции для выполнения следующего:

Вычисление обычных отработанных часов (40 часов и меньше) Вычисление отработанных сверхурочных часов (тех, которые превышают 40 часов) Вычисление регулярной оплаты (обычные часы, умноженные на регулярную оплату) Вычислить оплата сверхурочной работы (сверхурочные часы, умноженные на обычную оплату, умноженную на 1,5). Вычислите сумму выплаты брутто. Вычислите сумму удержанного федерального налога (15,1% валовой заработной платы). Вычислите сумму удержанного государственного налога (5,5% валовой заработной платы). (1,2% от заработной платы брутто) Вычислить сумму удерживаемого социального обеспечения (4,8% от заработной платы брутто) Вычислить общие отчисления (федеральный налог + налог штата + медицинское обслуживание + социальное обеспечение) Вычислить заработную плату net (заработная плата брутто - удержания) Вычислить общая (общая для всех) net оплата Распечатать (на экран) чистый итоговый отчет (см. вывод выше) Распечатать (на экран) общую сумму net оплата.

Я нашел функции для версии на основе ввода, поэтому мне было сложно извлечь данные из CSV и d используйте его в функциях.

ЕСЛИ вам нужно более простое копирование и прошивку программы, аналогичной этой, вот ссылка: Прочитать записи из файла CSV и распечатать отчет

Ожидаемый результат print (tmp [3]) - «10». Фактический результат .. «10». Я не знаю, почему он печатает лишнюю строку. Я думаю, что признаком этой проблемы является невозможность рассчитать регулярную оплату = Payrate * Horked. Ожидаемый результат - 420. 42 (зарплата) * 10 (часы) = 420 Вот ошибка в строке 133 «TypeError: невозможно умножить последовательность на не-int типа 'float'» в строке 132. Это домашнее задание. и я просто ищу решение этой ошибки, поэтому размещение всей моей программы кажется ненужным.

Вот файл csv:

First, Last, Hours, Pay
Matthew, Hightower, 42, 10
Samuel, Jackson, 53, 12.58
Catherine, Jones, 35, 19.43

Это вся программа. def main ():

results = get_data("employeestest.csv")

payrollSummaryReport(results)

def get_data(fname):

Function returns the dictionary with following 
format:
{ 0 : {
    "fname": "...",
    "lname": "...",
    "gross": "...",
  },
  1 : {
    ....,
    ,,,,
  },
}

result = {} # возвращаемое значение i = 0 # вы можете заархивировать range (), если хотите, используя open (fname, 'r') как 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
      employeeRegularHours, employeeOvertimeHours = calculateRegularHours(tmp[2])
      employeeOvertimeHours = calculateOvertimeHours(tmp[2])
      employeeTotalHours = calculateTotalHours(employeeRegularHours, employeeOvertimeHours)
      print(tmp[3])
This is were I print the item but it comes out to 
"10
       "
 I don't know why it skips a line. I found this error through this "TypeError:can't multiply sequence by non-int of type 'float'" at line 132

      #print(employeeRegularHours)
      regularPayAmount = calculateRegularPay(tmp[3], employeeRegularHours)
      overtimePayAmount = calculateOvertimePay(tmp[3], 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)
      #(calculateOvertimePay, calculateTotalHours) = 
      #etc.) and store the results in dictionary
      # e.g: 

      result[i]["fname"] = tmp[0]
      result[i]["lname"] = tmp[1]
      result[i]["hours"] = tmp[2]
      result[i]["payrate"] = tmp[3]
  # ...
      # do calculations for report
      # ...
      result[i]["regular"] = employeeRegularHours
      result[i]["overtime"] = employeeOvertimeHours
      result[i]["totalhours"] = employeeTotalHours
      result[i]["regPay"] = regularPayAmount
      result[i]["overPay"] = overtimePayAmount
      result[i]["gross"] = grossPayAmount
      result[i]["fedtax"] = federalTaxWithheld
      result[i]["stateTax"] = stateTaxWithheld
      result[i]["medTax"] = medicareTaxWithheld
      result[i]["socsectax"] = socSecTaxWithheld
      result[i]["totaltax"] = totalTaxesWithheld
      result[i]["netpay"] = netPayAmount
      i += 1
  return result

def calculateRegularHours(employeeHoursWorked) :
   #print(employeeHoursWorked)

   if float(employeeHoursWorked)  < 40.0 :
      employeeRegularHours = employeeHoursWorked
      employeeOvertimeHours = 0.0
   else:

     employeeRegularHours = 40.0
     employeeOvertimeHours = 0.0
    #employeeOvertimeHours = employeeHoursWorked - 40.0


   return employeeRegularHours, employeeOvertimeHours

def calculateOvertimeHours(employeeHoursWorked) :
   if float(employeeHoursWorked) > 40 :
       #float(employeeOvertimeHours) = employeeHoursWorked - 40
       #print(employeeHoursWorked)
       employeeOvertimeHours = 0.0
   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.151
    federalTaxWithheld = grossPayAmount * federalTaxRate
    return federalTaxWithheld

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

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

def calculateSocSecTax(grossPayAmount) :
    socSecTaxRate = 0.048
    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(vals):
    print()
    print("\t\t\t\t\t\tPayroll Summary Report")
    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"]))

main ()

                     [Expected Output][1]   

   Payroll Summary Report

Фамилия Имя Часы Обычные часы Сверхурочные часы
Хайтауэр Мэтью 42,0 40,0 2,0 400,0 30,0 430,00 107,07 322,93 Джексон Сэмюэл 53,0 40,0 13,0 506,0 246,68 752,67 187,42 565,25 Джонс Кэтрин 35,0 35,0 0,0 680,05 0,0 680,05 169,33 510,72

Итого Net Заработная плата 1398,90

Регулярная заработная плата OT Отчисления из заработной платы брутто Net Заработная плата

1 Ответ

0 голосов
/ 08 мая 2020

Вывод f.readlines включает символы конца строки (EOL), поэтому, если вы разделите строку запятыми и напечатаете последний элемент, он напечатает значение и символ конца строки (s ). Если вы сделаете print(repr(tmp[3])), вы увидите что-то вроде '10\n'.

Вы можете удалить EOL из строки следующим образом:

tmp = line.strip().split(",")

Однако, поскольку вы обрабатываете файл csv вы можете использовать встроенный модуль Python csv , который будет обрабатывать некоторые детали за вас

import csv

# Do stuff

with open(fname, 'r', newline='') as f:
    reader = csv.reader(f)
    # Skip header row
    next(reader)

    # reader yield lists, but since we know each list will have
    # the same number of elements we can unpack them into
    # four separate variables - this is more readable than 
    # referencing by index.
    for first_name, last_name, hours, pay_rate in reader:

        employeeRegularHours, employeeOvertimeHours = calculateRegularHours(hours)
        employeeOvertimeHours = calculateOvertimeHours(hours)
        employeeTotalHours = calculateTotalHours(employeeRegularHours, employeeOvertimeHours)

        # Do more stuff

Обратите внимание, что hours и pay_rate - это строки при чтении из файла. Если вы хотите использовать их как числа, вам нужно будет преобразовать их, используя int или float , в зависимости от того, какие числа вы хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...