Reputation: 67
I'm currently working with CSV files and i've hit a wall with my code. The goal i'm trying to reach is to be capable of writing a CSV file with 20 rows and 10 columns, 1 contains random names, 8 contain random integers, and final one with a random letter grade (I've been able to complete this step successfully). Then read the file, sum each row's integers (all the random integers generated) and find the average of all 8 scores(integers) and print a final letter grade based on the average and placing them in the last, empty, column and the end of each row. I've been unable to find a way of doing this at my current level, is there any commands that i can use for this purpose or any helpful tips or hints ? This is as far as i've gotten to this point.
import random
import csv
fname = ['Red','Jose','Mikasa','Sakura','Naruto','Momoka','Zero','Ryu','Ken','Geralt','Greg','Mika','Momo','Xenovia','John','Gary','Lance','Eren','Duke','Claire']
lname = ['Akerman','Haruno','Johnson','Rivia','Valentine','Redfield','Kennedy','Juarez','Jameson','Williams','Miller','Davis','Thompson','Garcia','Remington','Hayabusa','Strife','Armstrong','Kojima','Chambers']
def ranint():
value = random.randint(60, 100)
return value
def ranname():
first = random.choice(fname)
last = random.choice(lname)
fname.remove(first)
lname.remove(last)
return ("; ".join([first, last]))
with open('grades2.csv','w',newline='') as fp:
a = csv.writer(fp,delimiter=',')
data = [['Name', 'If Else', 'Loops', 'Functions', 'File IO', 'Conditionals', 'Repetition', 'Python Functions', 'Input Output', 'Grade'],
[ranname(), ranint(), ranint(), ranint(), ranint(), ranint(), ranint(), ranint(), ranint(), ],
[ranname(), ranint(), ranint(), ranint(), ranint(), ranint(), ranint(), ranint(), ranint(), ],
[ranname(), ranint(), ranint(), ranint(), ranint(), ranint(), ranint(), ranint(), ranint(), ],
[ranname(), ranint(), ranint(), ranint(), ranint(), ranint(), ranint(), ranint(), ranint(), ],
[ranname(), ranint(), ranint(), ranint(), ranint(), ranint(), ranint(), ranint(), ranint(), ],
[ranname(), ranint(), ranint(), ranint(), ranint(), ranint(), ranint(), ranint(), ranint(), ],
[ranname(), ranint(), ranint(), ranint(), ranint(), ranint(), ranint(), ranint(), ranint(), ],
[ranname(), ranint(), ranint(), ranint(), ranint(), ranint(), ranint(), ranint(), ranint(), ],
[ranname(), ranint(), ranint(), ranint(), ranint(), ranint(), ranint(), ranint(), ranint(), ],
[ranname(), ranint(), ranint(), ranint(), ranint(), ranint(), ranint(), ranint(), ranint(), ],
[ranname(), ranint(), ranint(), ranint(), ranint(), ranint(), ranint(), ranint(), ranint(), ],
[ranname(), ranint(), ranint(), ranint(), ranint(), ranint(), ranint(), ranint(), ranint(), ],
[ranname(), ranint(), ranint(), ranint(), ranint(), ranint(), ranint(), ranint(), ranint(), ],
[ranname(), ranint(), ranint(), ranint(), ranint(), ranint(), ranint(), ranint(), ranint(), ],
[ranname(), ranint(), ranint(), ranint(), ranint(), ranint(), ranint(), ranint(), ranint(), ],
[ranname(), ranint(), ranint(), ranint(), ranint(), ranint(), ranint(), ranint(), ranint(), ],
[ranname(), ranint(), ranint(), ranint(), ranint(), ranint(), ranint(), ranint(), ranint(), ],
[ranname(), ranint(), ranint(), ranint(), ranint(), ranint(), ranint(), ranint(), ranint(), ],
[ranname(), ranint(), ranint(), ranint(), ranint(), ranint(), ranint(), ranint(), ranint(), ],
[ranname(), ranint(), ranint(), ranint(), ranint(), ranint(), ranint(), ranint(), ranint(), ]]
a.writerows(data)
fp.close()
with open('grades2.csv', 'r', newline='') as fh:
z = csv.reader(fh)
Upvotes: 0
Views: 352
Reputation: 3018
Continuing from the last part of your code, you could try :
with open('grades2.csv', 'r', newline='') as fh:
z = csv.reader(fh)
next(z) #skip header
for row in z:
#slice the integer columns and convert to int
integers=[int(i) for i in row[1:9] ]
#find average
avg_integers=sum(integers)/len(integers)
print(avg_integers)
Upvotes: 1
Reputation: 2103
You can use pandas -
import pandas as pd
df = pd.read_csv('grades2.csv')
df['Total'] = df.sum(numeric_only=True, axis=1)
df['Mean'] = df['Total']/8
Upvotes: 0