在python中使用csv格式文件的问题

问题描述 投票:0回答:1

我正在 python 中使用 csv 文件和 csv 库以及统计均值函数做一个项目,我遇到了输出问题。不知道为什么会发生。这是我的代码:

def calculate_averages(input_file_name, output_file_name):
    fileName = input_file_name
    grades = []
    average = OrderedDict()
    with open(fileName, newline ='') as csvfile:
        reader = csv.reader(csvfile)
        try:
            for lines in reader:
                name = lines[0]
                for row in lines[1:]:
                    grades.append(int(row))
                grades_mean = mean(grades)
                average[name] = grades_mean
                #print(lines)
        except csv.Error as e:
            exit(f"file name {fileName}, line {reader.line_num} : {e}")
        with open(output_file_name, 'w', newline='') as output:
            writer = csv.writer(output)
            for key, values in average.items():
                writer.writerow([key, values])

我试图从本地主机读取一个 csv 文件,然后将姓名和成绩分开,并尝试将浮点数放入列表中,并取每一行的平均值,即每个人的成绩,然后将姓名和成绩意思是一起在有序的字典中。该方法确实有效,但没有给出准确的方法。

python csv
1个回答
0
投票

这里的问题是

grades
位于 for 循环之外,因此它会累积所有名称的成绩。您需要将其移动到
for ... in reader
循环内。更好的是,我们可以使用列表理解。这是解决此问题的一种方法:

import csv
from statistics import mean


def calculate_averages(input_file_name, output_file_name):
    average = []
    with open(input_file_name) as stream:
        reader = csv.reader(stream)
        for row in reader:
            name = row[0]
            grades = [float(value) for value in row[1:]]
            grades_mean = mean(grades)
            average.append((name, f"{grades_mean:>0.1f}"))

    with open(output_file_name, "w") as stream:
        writer = csv.writer(stream)
        writer.writerows(average)

注释

  • 我将
    lines
    重命名为
    row
    lines
    具有误导性,因为它只代表一行文本
  • 我还将
    row
    重命名为
    value
    :同样,行具有误导性,因为它代表一个数字,而数字是行的一部分
  • 我删除了 try/ except 结构:如果出现错误,输出将比仅仅打印出错误消息更有帮助
  • 我删除了
    OrderedDict
    的使用,因为一个简单的元组就足够了
  • 我将成绩格式化为
    0.1f
    规范,使输出更整洁
  • 我取消缩进
    with open(output ...
    以使代码嵌套不那么深
  • 我将
    .writerow
    替换为
    .writerows
© www.soinside.com 2019 - 2024. All rights reserved.