python文件操作——处理常见文件格式练习

创建一个程序,实现:

  1. 读取CSV格式的学生成绩文件
  2. 将数据转换为JSON格式保存
  3. 计算每个学生的平均分和等级
  4. 生成成绩报告(包括统计信息)
  5. 支持按科目或总分排序

下面做了两个版本学生成绩处理系统(新手友善版)和更友善的交互版本

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" 表头:{表头}")
            
            # 读取数据
            学生列表 = []
            forin 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五个等级
  • 多种排序:按各科成绩或总分排序
  • 完整统计:平均分、最高分、最低分、等级分布
  • 美观输出:整齐的表格格式

扩展提议

如果你想进一步练习,可以尝试:

  1. 添加新功能:让用户输入新的学生成绩
  2. 图形界面:使用tkinter创建图形界面
  3. 数据可视化:用matplotlib绘制成绩分布图
  4. 导入导出:支持从Excel文件导入数据

这个练习很好地结合了CSV处理、JSON转换、数据计算和排序等多个重大致念

© 版权声明
THE END
如果内容对您有所帮助,就支持一下吧!
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容