如何从一个CSV文件中读取姓名和成绩,并将其平均值写入另一个CSV文件?

fykwrbwg  于 11个月前  发布在  其他
关注(0)|答案(2)|浏览(95)

我是一个python初学者,我想从一个csv文件中读取一些名字和成绩,并在另一个csv文件中写入成绩的平均值。我可以从csv文件中读取成绩,但我不知道如何在另一个csv文件中写入平均值:((有没有办法在没有像pandas这样的库的帮助下编写此代码?)

import csv
from os import name
from statistics import mean

with open(input_file_name) as f:
    reader = csv.reader(f)
    for row in reader:
        name = row[0]
        grades = row[1:]
        these_grades1 = list()
        for grade in grades:
            these_grades1.append(int(grade))
            mean1 = mean(these_grades1)

        #print(name,float(mean1))

    with open(output_file_name, 'w' , newline='') as new_f:
        writer = csv.writer(new_f)

        for row in reader:
            writer.writerow("%s,%s" % (name, float(mean1)))

        new_f.close()

字符串
名称和等级:

marie,5,7,3,15
harry,3,9,4,20,9,1,8,16,0,5,2,4,7,2,1
john,19,10,19,6,8,14,3
sara,0,5,20,14
david,13,2,5,1,3,10,12,4,13,17,7,7
robert,1,9
james,0,16,16,13,19,2,17,8


正确输出:

marie,7.5
harry,6.066666666666666
john,11.285714285714286
sara,9.75
david,7.833333333333333
robert,5.0
james,11.375

shyt4zoc

shyt4zoc1#

这将给予你适当的结果

import csv
from os import name
from statistics import mean

#open both file here
with open(input_file_name) as f, open(output_file_name, 'w' , newline='') as new_f:
    #initialize writer 
    writer = csv.writer(new_f)
    
    #initialize reader
    reader = csv.reader(f)

    for row in reader:
        name = row[0]
        grades = row[1:]
        these_grades1 = list()
        for grade in grades:
            these_grades1.append(int(grade))
            # you don't need to calculate mean here 
        
        # calculate mean
        mean1 = mean(these_grades1)

        # write to file
        writer.writerow([name, float(mean1)])

字符串
更多Python版本:

import csv
from statistics import mean

with open(input_file_name) as f, open(output_file_name, 'w',
                                      newline='') as new_f:
    #initialize writer
    writer = csv.writer(new_f)

    #initialize reader
    reader = csv.reader(f)
    writer.writerows([[row[0], mean(map(int, row[1:]))] for row in reader])

mcvgt66p

mcvgt66p2#

代码中有几个错误:

  • 你保留了mean1,这意味着每次读取一个新学生时,每个学生的平均值都会丢失。使用列表来跟踪已经计算的平均值(在我的代码中是result)。
  • 不确定为什么在打印输出时忽略reader
  • writerow接受一个列表作为输入,而不是一个字符串(如果你使用字符串,它会非常奇怪地打印出来)

下面是一个固定版本:

import csv
from os import name

result = []
with open(input_file_name) as f:
    reader = csv.reader(f)
    for row in reader:
        name = row[0]
        grades = row[1:]
        for i, grade in enumerate(grades):
            grades[i] = int(grade)
        mean = sum(grades)/len(grades)
        result.append([name, mean])

with open(output_file_name, 'w' , newline='') as new_f:
    writer = csv.writer(new_f)
    for row in result:
        writer.writerow(row)

字符串
你也可以在没有列表的情况下这样做:

import csv
from os import name

with open(input_file_name) as f, open(output_file_name, 'w' , newline='') as new_f:
    reader = csv.reader(f)
    writer = csv.writer(new_f)
    for row in reader:
        name = row[0]
        grades = row[1:]
        for i, grade in enumerate(grades):
            grades[i] = int(grade)
        mean = sum(grades)/len(grades)
        writer.writerow([name, mean])

相关问题