如何遍历CSV特定行,检测新学生名时重新执行脚本?
单CSV文件下的学生数据分组处理方案
针对你这种同一学生数据跨多行、仅首行带姓名和性别的CSV格式,核心思路是逐行遍历并维护「当前学生」的状态,检测到新姓名时触发已有脚本的处理逻辑,具体实现步骤如下:
核心逻辑梳理
- 遍历CSV时,跳过表头行,逐行处理数据
- 对每行第一列(
student_name)做去空格处理:- 若处理后非空:判定为新学生,先处理上一个学生的留存数据(如果存在),再初始化新学生的信息
- 若处理后为空:判定为当前学生的后续科目数据,追加到该学生的科目列表中
- 遍历结束后,务必处理最后一个学生的数据(循环内不会触发新学生检测)
Python代码示例
假设你已有一个generate_student_report(student_info)函数负责生成报告,以下是适配该CSV格式的遍历逻辑:
import csv def generate_student_report(student_info): # 这里是你已实现的生成报告逻辑 print(f"正在处理学生:{student_info['name']}") print(f"性别:{student_info['gender']}") print("科目成绩:") for subj, score in student_info['subjects'].items(): print(f" {subj}: {score}") print("--- 报告生成完成 ---") def process_single_csv(csv_path): current_student = None with open(csv_path, mode='r', newline='', encoding='utf-8') as file: reader = csv.reader(file) next(reader) # 跳过表头 for row in reader: # 处理第一列的空格,判断是否为新学生 student_name = row[0].strip() if student_name: # 存在上一个学生,先处理其数据 if current_student: generate_student_report(current_student) # 初始化新学生信息:姓名、性别、第一个科目成绩 current_student = { 'name': student_name, 'gender': row[1], 'subjects': {row[2]: row[3]} } else: # 追加当前学生的后续科目数据 if current_student: subject = row[1].strip() marks = row[2].strip() current_student['subjects'][subject] = marks # 处理最后一个学生的数据 if current_student: generate_student_report(current_student) # 调用示例 process_single_csv("students_data.csv")
关键细节说明
- 处理空单元格:通过
strip()去除第一列的空格,避免因空格导致的误判 - 状态维护:用
current_student字典持续存储当前学生的所有数据,直到检测到下一个新学生 - 边界处理:循环结束后单独处理最后一个学生,避免遗漏
内容的提问来源于stack exchange,提问作者Anonymous
相关产品推荐
相关产品推荐

