Angel Torres
Angel Torres

Reputation: 67

Reading a CSV file and producing a sum with all the integers in a given row at the end of the row

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

Answers (2)

Sruthi
Sruthi

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

Aritesh
Aritesh

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

Related Questions