简体   繁体   中英

getting average of some digits from a csv file as input and Write the averages in an output csv file in python 3

I am learning python3 :), and I am trying to read a CSV file with different rows and take the average of the scores for each person(in each row) and write it in a CSV file as an output in python 3. The input file is like below:

David,5,2,3,1,6
Adele,3,4,1,5,2,4,2,1
...

The output file should seem like below:

David,4.75
Adele,2.75
...

It seems that I am reading the file correctly, as I print the average for each name in the terminal, but in CSV output file it prints only the average of the last name of the input file, while I want to print all names and corresponding averages in CSV output file. Anybody can help me with it?

import csv
from statistics import mean

these_grades = []
name_list = []
reader = csv.reader(open('input.csv', newline=''))
for row in reader:
    name = row[0]
    name_list.append(name)


    with open('result.csv', 'w', newline='\n') as f:
        writer = csv.writer(f,
                            delimiter=',',
                            quotechar='"',
                            quoting=csv.QUOTE_MINIMAL)

        for grade in row[1:]:
            these_grades.append(int(grade))
            for item in name_list:
                writer.writerow([''.join(item), mean(these_grades)])
    print('%s,%f' % (name , mean(these_grades)))

There are several issues in your code:

  1. You're not using a context manager ( with ) when you read the input file. There's no reason to use it when writing but not when reading - you consequently don't close the "input.csv" file
  2. You're using a list to store data from rows. This doesn't easily distinguish between the person's name and the scores associated with the person. It would be better to use a dictionary in which the key is the person's name, and the values stored against that key are the individual scores
  3. You repeatedly open the file within a for loop in 'w' mode. Every time you open a file in write mode, it just wipes all the previous contents. You actually do write each row to the file, but you just wipe it again when you open the file on the next iteration.

You can use:

import csv
import statistics


# use a context manager to read the data in too, not just for writing
with open('input.csv') as infile:
    reader = csv.reader(infile)
    data = list(reader)

# Create a dictionary to store the scores against the name
scores = {}

for row in data:
    scores[row[0]] = row[1:] # First item in the row is the key (name) and the rest is values


with open('output.csv', 'w', newline='') as outfile:
    writer = csv.writer(outfile)

    # Now we need to iterate the dictionary and average the score on each iteration
    for name, scores in scores.items():
        ave_score = statistics.mean([int(item) for item in scores])
        writer.writerow([name, ave_score])

This can be further consolidated, but it's less easy to see what's happening:

with open('input.csv') as infile, open('output.csv', 'w', newline='') as outfile:
    reader = csv.reader(infile)
    writer = csv.writer(outfile)
    for row in reader:
        name = row[0]
        values = row[1:]
        ave_score = statistics.mean(map(int, values))
        writer.writerow([name, ave_score])

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM