计算文件中的平均成绩。如果文件不存在,则应返回 None,如果不包含任何等级,则应返回 0.0



输入(这是mygrades.txt文件包含的内容)

CS1:5.75
#
CS 2: 5.5
Mathematik 1:5.75
@ !
经济学1:5.5
物理:6
化学:5.75
!#
@

输出:5.70

代码:

import os
def get_average_grade(path):
grades = []
filesize = os.path.getsize("C:\UsersDocumentsmygrades.txt")
if not os.path.exists(path):
return None          
with open("C:\UsersDocumentsmygrades.txt", "r") as f:
filesize = os.path.getsize("C:\UsersDocumentsmygrades.txt")
if filesize == 0: # not entirely correct because it might contain "#@$%$^&^&*^" for example which means no grade but wont return 0.0
return 0.0  
else:
for line in f.readlines():
if ":" in line:
searchforcolon = line.find(":")
number1 = float(line[searchforcolon + 1:])
grades.append(number1)
average = sum(grades)/len(grades)
return average
print(get_average_grade("C:\UsersDocumentsmygrades.txt"))

下面的代码表达可以完成这项工作。我假设您想将平均值四舍五入到小数点后第二位:

v = []
with open(PATH_TO_FILE, "r") as f:
for l in f.readlines():
if ":" in l:
v.append(float(l.split(":")[1].strip()))
print(f'{int(100 * sum(v)/len(v))/100:.2f}' if len(v) > 0 else None)

您似乎想要这样做:

import os

def get_average_grade(path):
if not os.path.exists(path):
return None
grades = []
with open(path) as file:
for line in file:
if ':' in line:
_, grade = line.strip().split(':')
if ''.join(grade.strip().split('.', maxsplit=1)).isnumeric():
grades.append(float(grade))
return (grades and round(sum(grades) / len(grades), 2)) or 0.0

print(get_average_grade('myfile.txt'))

首先,你没有在你的函数中正确地使用path参数,你必须把它放在你使用路径的任何地方。

这个函数的工作非常简单,首先检查路径是否存在,是否不返回None。然后定义一个列表并打开文件(使用for line in f而不是for line if f.readlines())。然后检查分号是否在行中,并被分号分隔,而不是试图找到它的索引,这将返回一个列表,该列表将包含该行中每个分号前后的文本。因此,通过解包提取等级,然后检查它是否可以转换为浮点数,如果不可能,则继续(如果无法转换为浮点数,您可能希望以某种方式提醒用户)。然后有一个简单的短路,它首先检查分数列表是否为空,如果是,则返回0.0(因此没有找到分数),否则它返回四舍五入到小数点后2位的平均值