小白:(发愁)我要管理学生成绩数据,不仅要生成数据存到文件,后续还要读取分析,感觉一团糟,怎么破?
"""
综合练习:学生成绩管理系统
功能需求:
1. 生成随机学生成绩数据并保存到文件
2. 从文件读取数据并进行统计分析
3. 包含异常处理机制
4. 使用函数模块化代码
5. 包含上下文管理器使用
"""
专家:(递上代码秘籍)利用我们之前文章学习的random函数、CSV模块,上下文管理器,结合异常处理机制,轻松搭建学生成绩管理系统!
:生成 30 条包含学号与三科成绩的随机数据,并存储到 CSV 文件。
:从 CSV 文件读取数据,计算各科平均分,找出总分最高的学生。
:处理文件操作和数据格式错误引发的异常。
:通过不同函数,实现数据生成、文件读写、数据分析等功能,提升代码的可读性与维护性。
:运用上下文管理器,确保文件的正确打开与关闭。
Python 借助random模块,能轻松生成随机学生成绩数据。
import random
# 生成随机学生数据函数
def generate_student_data(num_students=30):
"""生成包含学号和三科成绩的随机数据"""
return [
(f"2023{str(i).zfill(4)}",
random.randint(60, 100),
random.randint(60, 100),
random.randint(60, 100))
for i in range(1, num_students + 1)
]
生成原理:
随机分数:利用random.randint(60, 100),生成 60 到 100 之间的随机整数作为学生成绩。
学号生成:借助str().zfill(4),保证学号后四位是 4 位序列号,如20230001。
列表推导式:通过列表推导式,快速生成 30 个学生的数据。
为了规范文件操作,我们自定义了csv_file_manager上下文管理器,并借助csv模块进行 CSV 文件的读写。
from contextlib import contextmanager
import csv
# 自定义上下文管理器用于文件操作
@contextmanager
def csv_file_manager(file_path, mode='r'):
"""处理CSV文件操作的上下文管理器"""
try:
file = open(file_path, mode, newline='', encoding='utf-8')
yield file
except IOError as e:
print(f"文件操作出错: {str(e)}")
raise
finally:
if 'file' in locals():
file.close()
# 保存数据到CSV文件
def save_to_csv(data, filename):
"""将数据保存为CSV文件"""
with csv_file_manager(filename, 'w') as f:
writer = csv.writer(f)
writer.writerow(['学号', '语文', '数学', '英语'])
writer.writerows(data)
print(f"数据已保存至 {filename}")
# 从CSV文件读取数据
def load_from_csv(filename):
"""从CSV文件加载数据"""
try:
with csv_file_manager(filename) as f:
reader = csv.reader(f)
next(reader) # 跳过标题行
return [
(row[0],int(row[1]),int(row[2]),int(row[3]))
for row in reader if len(row) == 4
]
except ValueError as e:
print(f"数据格式错误: {str(e)}")
return []
实现要点:
:csv_file_manager处理文件的打开、关闭,并捕获IOError异常。
:save_to_csv函数,将数据写入 CSV 文件,并添加标题行。
:load_from_csv函数,跳过标题行,读取数据并进行类型转换,同时处理数据格式错误。
通过一系列计算,实现对学生成绩的统计分析。
# 统计分析函数
def analyze_scores(data):
"""进行成绩统计分析"""
if not data:
print("无有效数据可供分析")
return
# 计算各科平均分
chinese_avg = sum(s[1] for s in data) / len(data)
math_avg = sum(s[2] for s in data) / len(data)
english_avg = sum(s[3] for s in data) / len(data)
# 找最高总分学生
total_scores = [(s[0], sum(s[1:])) for s in data]
top_student = max(total_scores, key=lambda x: x[1])
print("\n=== 统计分析结果 ===")
print(f"语文平均分: {chinese_avg:.1f}")
print(f"数学平均分: {math_avg:.1f}")
print(f"英语平均分: {english_avg:.1f}")
print(f"总分最高学生: {top_student[0]} 总分: {top_student[1]}")
实现原理:
:使用生成器表达式,分别计算语文、数学、英语的平均分,如sum(s[1] for s in data) / len(data)。
:借助max()函数和lambda表达式,找出总分最高的学生,如max(total_scores, key=lambda x: x[1])。
:在开始分析前,检查数据是否为空,避免除以零错误。
主程序整合上述功能,实现数据的生成、保存、读取和分析。
def main():
try:
# 生成随机数据
students = generate_student_data()
# 保存数据
filename = input("请输入保存文件名(例如 scores.csv): ")
save_to_csv(students, filename)
# 读取数据
loaded_data = load_from_csv(filename)
# 分析数据
if loaded_data:
analyze_scores(loaded_data)
except Exception as e:
print(f"程序运行出错: {str(e)}")
if __name__ == "__main__":
main()
流程概述:
:提示用户输入保存文件名,增强程序的交互性。
:通过try-except捕获程序运行过程中的异常,提升程序的稳定性。
:调用前面定义的函数,实现数据的全生命周期管理。
请输入保存文件名(例如 scores.csv): data.csv
数据已保存至 data.csv
=== 统计分析结果 ===
语文平均分: 80.0
数学平均分: 81.9
英语平均分: 77.5
总分最高学生: 20230025 总分: 290
:融合随机数生成、文件操作、上下文管理器、异常处理等知识。
:代码结构清晰,便于维护和扩展。
:使用类型提示和文档字符串,提升代码的可读性。
:实现数据从生成、存储、读取到分析的完整管理。
:具备用户友好的输入输出设计,交互体验好。