我正在 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 文件,然后将姓名和成绩分开,并尝试将浮点数放入列表中,并取每一行的平均值,即每个人的成绩,然后将姓名和成绩意思是一起在有序的字典中。该方法确实有效,但没有给出准确的方法。
这里的问题是
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
:同样,行具有误导性,因为它代表一个数字,而数字是行的一部分OrderedDict
的使用,因为一个简单的元组就足够了0.1f
规范,使输出更整洁with open(output ...
以使代码嵌套不那么深.writerow
替换为 .writerows