Appearance
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
符合预期。