创建一个程序,实现:
- 读取CSV格式的学生成绩文件
- 将数据转换为JSON格式保存
- 计算每个学生的平均分和等级
- 生成成绩报告(包括统计信息)
- 支持按科目或总分排序
下面做了两个版本学生成绩处理系统(新手友善版)和更友善的交互版本
import csv
import json
def 读取csv成绩文件(文件名='学生成绩.csv'):
"""读取CSV格式的学生成绩文件"""
try:
with open(文件名, 'r', encoding='utf-8') as file:
# 使用csv读取器
csv_reader = csv.reader(file)
# 读取表头
表头 = next(csv_reader)
print(f" 表头:{表头}")
# 读取数据
学生列表 = []
for 行 in csv_reader:
if 行: # 确保不是空行
学生列表.append(行)
print(f"✅ 成功读取 {len(学生列表)} 个学生的成绩")
return 表头, 学生列表
except FileNotFoundError:
print(f"❌ 文件 {文件名} 不存在!")
return None, None
def 创建示例csv文件():
"""如果CSV文件不存在,创建一个示例文件"""
示例数据 = [
['学号', '姓名', '语文', '数学', '英语'],
['001', '张三', '85', '92', '78'],
['002', '李四', '76', '88', '90'],
['003', '王五', '92', '85', '96'],
['004', '赵六', '68', '72', '65'],
['005', '钱七', '95', '98', '92']
]
with open('学生成绩.csv', 'w', encoding='utf-8', newline='') as file:
writer = csv.writer(file)
writer.writerows(示例数据)
print("✅ 示例CSV文件创建完成!")
def 计算平均分和等级(学生数据):
"""计算每个学生的平均分和等级"""
处理后的学生列表 = []
for 学生 in 学生数据:
学号, 姓名, 语文, 数学, 英语 = 学生
# 转换为数字
语文分 = int(语文)
数学分 = int(数学)
英语分 = int(英语)
# 计算总分和平均分
总分 = 语文分 + 数学分 + 英语分
平均分 = 总分 / 3
# 确定等级
if 平均分 >= 90:
等级 = 'A'
elif 平均分 >= 80:
等级 = 'B'
elif 平均分 >= 70:
等级 = 'C'
elif 平均分 >= 60:
等级 = 'D'
else:
等级 = 'E'
# 添加到处理后的列表
处理后的学生列表.append({
'学号': 学号,
'姓名': 姓名,
'语文': 语文分,
'数学': 数学分,
'英语': 英语分,
'总分': 总分,
'平均分': round(平均分, 2), # 保留两位小数
'等级': 等级
})
return 处理后的学生列表
def 保存为json文件(学生数据, 文件名='学生成绩.json'):
"""将处理后的数据保存为JSON格式"""
数据字典 = {
'学生成绩数据': 学生数据,
'统计信息': 计算统计信息(学生数据)
}
with open(文件名, 'w', encoding='utf-8') as file:
json.dump(数据字典, file, ensure_ascii=False, indent=2)
print(f"✅ 数据已保存为JSON文件:{文件名}")
def 计算统计信息(学生数据):
"""计算成绩统计信息"""
if not 学生数据:
return {}
# 初始化统计字典
统计 = {
'总人数': len(学生数据),
'各科平均分': {},
'各科最高分': {},
'各科最低分': {},
'等级分布': {'A': 0, 'B': 0, 'C': 0, 'D': 0, 'E': 0}
}
科目列表 = ['语文', '数学', '英语']
# 计算各科统计
for 科目 in 科目列表:
成绩列表 = [学生[科目] for 学生 in 学生数据]
统计['各科平均分'][科目] = round(sum(成绩列表) / len(成绩列表), 2)
统计['各科最高分'][科目] = max(成绩列表)
统计['各科最低分'][科目] = min(成绩列表)
# 计算等级分布
for 学生 in 学生数据:
等级 = 学生['等级']
统计['等级分布'][等级] += 1
return 统计
def 显示成绩报告(学生数据, 统计信息):
"""显示完整的成绩报告"""
print("
" + "=" * 60)
print(" 学生成绩报告")
print("=" * 60)
# 显示学生成绩表格
print("
学生成绩详情:")
print("-" * 80)
print(f"{'学号':<6} {'姓名':<6} {'语文':<4} {'数学':<4} {'英语':<4} {'总分':<5} {'平均分':<6} {'等级':<4}")
print("-" * 80)
for 学生 in 学生数据:
print(f"{学生['学号']:<6} {学生['姓名']:<6} {学生['语文']:<4} {学生['数学']:<4} {学生['英语']:<4} "
f"{学生['总分']:<5} {学生['平均分']:<6} {学生['等级']:<4}")
# 显示统计信息
print("
成绩统计信息:")
print("-" * 40)
print(f"总人数:{统计信息['总人数']}")
print("
各科成绩统计:")
for 科目 in ['语文', '数学', '英语']:
print(f" {科目}:平均{统计信息['各科平均分'][科目]}分,"
f"最高{统计信息['各科最高分'][科目]}分,"
f"最低{统计信息['各科最低分'][科目]}分")
print("
等级分布:")
for 等级, 人数 in 统计信息['等级分布'].items():
print(f" {等级}等:{人数}人")
def 排序学生数据(学生数据, 排序方式='总分', 顺序='降序'):
"""按指定方式排序学生数据"""
# 确定排序键
if 排序方式 in ['语文', '数学', '英语', '总分', '平均分']:
排序键 = 排序方式
else:
print("❌ 不支持的排序方式!")
return 学生数据
# 确定排序顺序
是否降序 = (顺序 == '降序')
# 排序
排序后数据 = sorted(学生数据, key=lambda x: x[排序键], reverse=是否降序)
print(f"✅ 已按{排序方式}{顺序}排序")
return 排序后数据
def 主菜单():
"""显示主菜单和处理用户选择"""
# 检查文件是否存在,不存在则创建
try:
with open('学生成绩.csv', 'r', encoding='utf-8'):
pass
except FileNotFoundError:
创建示例csv文件()
# 读取数据
表头, 原始学生数据 = 读取csv成绩文件()
if not 原始学生数据:
return
# 处理数据
学生数据 = 计算平均分和等级(原始学生数据)
统计信息 = 计算统计信息(学生数据)
while True:
print("
" + "=" * 50)
print(" 学生成绩处理系统")
print("=" * 50)
print("1. 显示成绩报告")
print("2. 按总分排序")
print("3. 按语文成绩排序")
print("4. 按数学成绩排序")
print("5. 按英语成绩排序")
print("6. 按平均分排序")
print("7. 保存为JSON文件")
print("8. 退出系统")
print("=" * 50)
选择 = input("请选择操作 (1-8): ")
if 选择 == '1':
显示成绩报告(学生数据, 统计信息)
elif 选择 == '2':
学生数据 = 排序学生数据(学生数据, '总分')
显示成绩报告(学生数据, 统计信息)
elif 选择 == '3':
学生数据 = 排序学生数据(学生数据, '语文')
显示成绩报告(学生数据, 统计信息)
elif 选择 == '4':
学生数据 = 排序学生数据(学生数据, '数学')
显示成绩报告(学生数据, 统计信息)
elif 选择 == '5':
学生数据 = 排序学生数据(学生数据, '英语')
显示成绩报告(学生数据, 统计信息)
elif 选择 == '6':
学生数据 = 排序学生数据(学生数据, '平均分')
显示成绩报告(学生数据, 统计信息)
elif 选择 == '7':
保存为json文件(学生数据)
elif 选择 == '8':
print("感谢使用!再见!")
break
else:
print("❌ 无效选择,请重新输入!")
# 运行程序
if __name__ == "__main__":
主菜单()
更友善的交互版本
import csv
import json
def 简单成绩处理系统():
"""更简单直观的版本,适合完全新手"""
print(" 欢迎使用学生成绩处理系统!")
print("=" * 50)
# 步骤1:检查并创建示例文件
try:
with open('学生成绩.csv', 'r', encoding='utf-8'):
print("✅ 找到成绩文件")
except FileNotFoundError:
print(" 创建示例成绩文件...")
创建示例csv文件()
# 步骤2:读取CSV文件
print("
正在读取成绩文件...")
表头, 原始数据 = 读取csv成绩文件()
if not 原始数据:
return
# 步骤3:处理数据
print("
正在计算成绩...")
学生列表 = []
for 学生 in 原始数据:
学号, 姓名, 语文, 数学, 英语 = 学生
# 计算成绩
语文分 = int(语文)
数学分 = int(数学)
英语分 = int(英语)
总分 = 语文分 + 数学分 + 英语分
平均分 = 总分 / 3
# 确定等级
if 平均分 >= 90:
等级 = 'A (优秀)'
elif 平均分 >= 80:
等级 = 'B (良好)'
elif 平均分 >= 70:
等级 = 'C (中等)'
elif 平均分 >= 60:
等级 = 'D (及格)'
else:
等级 = 'E (不及格)'
# 存储学生信息
学生信息 = {
'学号': 学号,
'姓名': 姓名,
'语文': 语文分,
'数学': 数学分,
'英语': 英语分,
'总分': 总分,
'平均分': round(平均分, 1),
'等级': 等级
}
学生列表.append(学生信息)
# 步骤4:显示结果
print("
成绩处理结果:")
print("=" * 70)
print(f"{'学号':<6} {'姓名':<6} {'语文':<4} {'数学':<4} {'英语':<4} {'总分':<5} {'平均分':<6} {'等级':<10}")
print("=" * 70)
for 学生 in 学生列表:
print(f"{学生['学号']:<6} {学生['姓名']:<6} {学生['语文']:<4} {学生['数学']:<4} {学生['英语']:<4} "
f"{学生['总分']:<5} {学生['平均分']:<6} {学生['等级']:<10}")
# 步骤5:统计信息
print("
班级成绩统计:")
print("-" * 40)
# 计算平均分
语文平均 = sum(学生['语文'] for 学生 in 学生列表) / len(学生列表)
数学平均 = sum(学生['数学'] for 学生 in 学生列表) / len(学生列表)
英语平均 = sum(学生['英语'] for 学生 in 学生列表) / len(学生列表)
总平均 = sum(学生['平均分'] for 学生 in 学生列表) / len(学生列表)
print(f"语文平均分:{语文平均:.1f}")
print(f"数学平均分:{数学平均:.1f}")
print(f"英语平均分:{英语平均:.1f}")
print(f"总平均分:{总平均:.1f}")
# 步骤6:保存为JSON
print("
正在保存为JSON格式...")
完整数据 = {
'班级': '示例班级',
'学生数量': len(学生列表),
'学生成绩': 学生列表,
'统计信息': {
'语文平均分': round(语文平均, 1),
'数学平均分': round(数学平均, 1),
'英语平均分': round(英语平均, 1),
'总平均分': round(总平均, 1)
}
}
with open('学生成绩.json', 'w', encoding='utf-8') as file:
json.dump(完整数据, file, ensure_ascii=False, indent=2)
print("✅ 数据已保存为 '学生成绩.json'")
# 步骤7:排序功能
print("
排序功能演示:")
# 按总分排序
按总分排序 = sorted(学生列表, key=lambda x: x['总分'], reverse=True)
print("
按总分排名:")
print("-" * 50)
for i, 学生 in enumerate(按总分排序, 1):
print(f"第{i}名:{学生['姓名']} - 总分:{学生['总分']}")
# 按语文排序
按语文排序 = sorted(学生列表, key=lambda x: x['语文'], reverse=True)
print("
语文成绩排名:")
print("-" * 50)
for i, 学生 in enumerate(按语文排序, 1):
print(f"第{i}名:{学生['姓名']} - 语文:{学生['语文']}分")
# 运行简单版本
简单成绩处理系统()
生成的JSON文件示例
运行程序后,会生成一个 学生成绩.json 文件,内容如下:
{
"学生成绩数据": [
{
"学号": "001",
"姓名": "张三",
"语文": 85,
"数学": 92,
"英语": 78,
"总分": 255,
"平均分": 85.0,
"等级": "B"
},
{
"学号": "002",
"姓名": "李四",
"语文": 76,
"数学": 88,
"英语": 90,
"总分": 254,
"平均分": 84.67,
"等级": "B"
},
{
"学号": "003",
"姓名": "王五",
"语文": 92,
"数学": 85,
"英语": 96,
"总分": 273,
"平均分": 91.0,
"等级": "A"
},
{
"学号": "004",
"姓名": "赵六",
"语文": 68,
"数学": 72,
"英语": 65,
"总分": 205,
"平均分": 68.33,
"等级": "D"
},
{
"学号": "005",
"姓名": "钱七",
"语文": 95,
"数学": 98,
"英语": 92,
"总分": 285,
"平均分": 95.0,
"等级": "A"
}
],
"统计信息": {
"总人数": 5,
"各科平均分": {
"语文": 83.2,
"数学": 87.0,
"英语": 84.2
},
"各科最高分": {
"语文": 95,
"数学": 98,
"英语": 96
},
"各科最低分": {
"语文": 68,
"数学": 72,
"英语": 65
},
"等级分布": {
"A": 2,
"B": 2,
"C": 0,
"D": 1,
"E": 0
}
}
}
运行结果示例
当你运行程序时,会看到类似这样的输出:
学生成绩处理系统
==================================================
1. 显示成绩报告
2. 按总分排序
3. 按语文成绩排序
4. 按数学成绩排序
5. 按英语成绩排序
6. 按平均分排序
7. 保存为JSON文件
8. 退出系统
==================================================
请选择操作 (1-8): 1
============================================================
学生成绩报告
============================================================
学生成绩详情:
--------------------------------------------------------------------------------
学号 姓名 语文 数学 英语 总分 平均分 等级
--------------------------------------------------------------------------------
001 张三 85 92 78 255 85.0 B
002 李四 76 88 90 254 84.67 B
003 王五 92 85 96 273 91.0 A
004 赵六 68 72 65 205 68.33 D
005 钱七 95 98 92 285 95.0 A
成绩统计信息:
----------------------------------------
总人数:5
各科成绩统计:
语文:平均83.2分,最高95分,最低68分
数学:平均87.0分,最高98分,最低72分
英语:平均84.2分,最高96分,最低65分
等级分布:
A等:2人
B等:2人
C等:0人
D等:1人
E等:0人
代码特点说明
1. 新手友善的设计
- 详细注释:每段代码都有中文注释
- 简单逻辑:避免复杂的编程概念
- 逐步执行:一步一步完成每个功能
- 错误处理:处理文件不存在等情况
2. 完整的功能实现
- ✅ 读取CSV格式文件
- ✅ 转换为JSON格式保存
- ✅ 计算平均分和等级
- ✅ 生成成绩报告和统计信息
- ✅ 支持多种排序方式
3. 实用的功能
- 等级评定:A-E五个等级
- 多种排序:按各科成绩或总分排序
- 完整统计:平均分、最高分、最低分、等级分布
- 美观输出:整齐的表格格式
扩展提议
如果你想进一步练习,可以尝试:
- 添加新功能:让用户输入新的学生成绩
- 图形界面:使用tkinter创建图形界面
- 数据可视化:用matplotlib绘制成绩分布图
- 导入导出:支持从Excel文件导入数据
这个练习很好地结合了CSV处理、JSON转换、数据计算和排序等多个重大致念
© 版权声明
文章版权归作者所有,未经允许请勿转载。如内容涉嫌侵权,请在本页底部进入<联系我们>进行举报投诉!
THE END















暂无评论内容