Answer:
#Take input from the user
filename=input('Enter name of input file: ')
total_units=0#Total number of units for a student
total_score=0#Total score of a student
#Assign a score to each grade. I have reduced 0.33 for each grade. Change here if you need to
grade={'A':4.0,'A-':3.67,'B+':3.34,'B':3.01,'B-':2.68,'C+':2.35,'C':2.02,'C-':1.69,'D+':1.36,'D':1.03}
try:
with open(filename,"r") as input_file:#Open the file for input(reading)
output_file=open("GPA_output.txt","w") #Create and open GPA_output.txt if it doesn't exist for writing
for student_record in input_file:#read from input file
if("," in student_record):#if there is a , that means this is the student name
student_name=student_record.strip('\n')#Remove \n from student name
continue
else:
if(" " in student_record):#If a line contains spaces then its the student's grades for a course
student=student_record.split(" ")#Split to find the coursename, units and grade
#student[0]=coursename student[1]=units student[2]=grade
total_units+=int(student[1])#Calculate total units for 1 student
total_score+=int(student[1])*grade[student[2].strip('\n')]#Find the total score of a student
#grade[student[2]] will lookup for the score that we initialized earlier
#if student has a grade as A then this will look up as grade['A'] which will return 4
#Find the total score as product of this grade and units for this course
continue
else:
if(total_units>0):#Check if score has been calculated for a student earlier
print("in")
GPA=total_score/total_units#Calculate the GPA
output_file.write("%-26s%.2f\n" % (student_name, GPA))#Write the GPA and Student Name in the required format
total_units=0#reset the units
total_score=0#reset the score
if(total_units>0):#Essential for the case when the file doesn't end with a new line(Check if total_units is not 0) which means a record is pending
#to be written to the file
GPA=total_score/total_units#Calculate the GPA
output_file.write("%-26s%.2f\n" % (student_name, GPA))#Write the GPA and Student Name in the required format
total_units=0#reset the units
total_score=0#reset the score
input_file.close()#Close the input file
output_file.close()#Close the output file
except IOError as e:
print("Problem in Opening the required file")#Print a message if file cannot be opened
Explanation:
The program has been tested for all 3 scenarios mentioned i.e.
a. If the file ends without \n
b. If the file ends with 2 \n
c. If the file ends with 1 \n
PS: The Program will run irrespective of how it ends. Even if there are many \n at the end of file, the program will be fine.