Skip to content

Python 实战:对文件中的学生按成绩排序

要求

文件 source.txt 记录了某班级学生的语文成绩,一行对应一个学生,每一行有三个字段,分别是学号、姓名、分数。三个字段用英文逗号隔开。

source.txt 文件内容如下:

23423212382,张一,90
23423212384,张二,92
23423212385,张三,92
23423212375,张四,80
23423212315,张五,99

现在需要:
1,检查文件中有没有出现重复的学号,检查学号是不是都是数字。
2,对学生成绩进行排序,按照分数从大到小排序,如果分数一样,则按照学号从大到小排序。排序结果写到文件 sort_result.txt 中。

实现

python
def check_duplicate_and_numeric(student_ids):                  #检查是否都是数字
    for sid in student_ids:
        if not sid.isdigit():
            print(f"错误:学号 '{sid}' 包含非数字字符")            #检查字符串是否只包括数字字符
            return False
    if len(student_ids) != len(set(student_ids)):              #检查是否有重复
        print("错误:文件中存在重复的学号")
        return False
    return True

def process_scores():                                          #主处理函数
    try:
        with open('./source.txt', 'r', encoding='utf-8') as f:   #读取源文件,utf-8编码支持中文
            lines = f.readlines()                              #readlines()读取所有行到列表lines中
        students = []                                          #存储学生数据
        student_ids = []                                       #存储学生学号
        for line in lines:
            line = line.strip()                                #去除行首尾的空白字符
            if not line:
                continue                                       #如果是空行则跳过
            parts = line.split(',')                            #按逗号分隔字段
            if len(parts) != 3:                                #检查字段数量是否为3
                print(f"警告:行 '{line}' 格式不正确,跳过")
                continue
            sid, name, score = parts                           #赋值3个字段
            student_ids.append(sid)                            #将学号添加到验证列表
            try:
                score = int(score)                             #将分数转换成整数
                students.append((sid, name, score))
            except ValueError:                                 #转换失败
                print(f"警告:行 '{line}' 分数不是整数,跳过")
        if not check_duplicate_and_numeric(student_ids):       #检查学号
            return
        students.sort(key=lambda x: (-x[2], -int(x[0])))       #-x[2]表示按分数降序,-int(x[0])表示分数相同时按学号降序
        with open('./sort_result.txt', 'w', encoding='utf-8') as f: # 写入结果文件
            for sid, name, score in students:
                f.write(f"{sid},{name},{score}\n")             #按原格式写入
        print("排序完成,结果已写入 sort_result.txt")

    except FileNotFoundError:                                  #文件不存在
        print("错误:找不到 source.txt 文件")
    except Exception as e:                                     #其他所有异常
        print(f"发生错误:{str(e)}")

if __name__ == "__main__":                                     #定义脚本执行入口
    process_scores()

将代码保存为文件 sort_student_score.py ,放在 source.txt 同一个目录中。执行代码,可以看到有 sort_result.txt 文件生成。

sort_result.txt 内容如下:

23423212315,张五,99
23423212385,张三,92
23423212384,张二,92
23423212382,张一,90
23423212375,张四,80

符合预期。