You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Python提取学生成绩数据并生成指定格式CSV文件

学生成绩提取结构化文件实现方案

需求概述

从文本字符串行中提取学生成绩数据,写入列规则明确的结构化文件,缺考科目统一填充-1,支持逗号、竖线两种分隔格式。

原始数据样例

Andrew Taggart 12345678 Math: 90 English: 78 Physics: 85
Jame Bond 1012478 English: 97 Physics: 85 Chemistry: 76
Hope Williams 1478978 Math: 89 English: 85 Physics: 76

期望输出格式

逗号分隔CSV格式

表头固定为Name, Student_ID, Math, English, Physics, Chemistry,示例如下:

Andrew Taggart, 12345678, 90, 78, 85, -1
Jame Bond, 1012478, -1, 97, 85, 76
Hope Williams, 1478978, 89, 85, 76, -1

竖线分隔格式

示例如下:

name|subject1|subject2|subject3
name1|23|34|23
name2|3|2|5

现有基础代码

import re
student = "Andrew Taggart 12345678 Math: 90 English: 78 Physics: 85"
        
name = re.split (r'(\d+)', student) [0] #extract name 
# Output: Andrew Taggart
ID = re.split (r'(\d+)', student) [1] #extract ID 
# Output: 12345678 

headers = ["Math", "English", "Physics", "Chemistry"] 
grade = re.findall(r"[-+]?\d*\.\d+|\d+", student) [1:] 
# Output: ["90", "70", "85"]
student_grade = list (i.strip().replace(":", "") for i in re.split (r"(\d+.\d+|\d+')", student)) [2:-1] 
# Output: ["Math", "90", "English", "78", "Physics", "85"]

完整实现代码

import re
import csv

# 全局配置:固定表头
FULL_HEADERS = ["Name", "Student_ID", "Math", "English", "Physics", "Chemistry"]
SUBJECT_LIST = FULL_HEADERS[2:]

def parse_single_student(line: str) -> list:
    """解析单条学生成绩文本行,返回固定顺序的结构化数据"""
    # 提取姓名、学号
    split_parts = re.split(r'(\d+)', line, maxsplit=1)
    name = split_parts[0].strip()
    student_id = split_parts[1].strip()
    # 提取科目-分数对并转为字典
    subject_score_raw = [i.strip().replace(":", "") for i in re.split(r'(\d+\.?\d*)', line) if i.strip()][2:]
    score_map = dict(zip(subject_score_raw[::2], subject_score_raw[1::2]))
    # 按固定顺序拼接结果,缺科填充-1
    result = [name, student_id]
    for sub in SUBJECT_LIST:
        result.append(score_map.get(sub, "-1"))
    return result

def export_file(data: list[list], output_path: str, separator: str = ","):
    """将解析后的结构化数据导出为指定分隔符的文件"""
    if separator == ",":
        # 逗号分隔用csv模块处理,避免特殊字符冲突
        with open(output_path, "w", newline="", encoding="utf-8") as f:
            writer = csv.writer(f)
            writer.writerow(FULL_HEADERS)
            writer.writerows(data)
    else:
        # 自定义分隔符直接拼接写入
        with open(output_path, "w", encoding="utf-8") as f:
            f.write(separator.join(FULL_HEADERS) + "\n")
            for row in data:
                f.write(separator.join(row) + "\n")

# 调用示例
if __name__ == "__main__":
    # 原始数据行,可替换为从txt文件读取的内容
    raw_data = [
        "Andrew Taggart 12345678 Math: 90 English: 78 Physics: 85",
        "Jame Bond 1012478 English: 97 Physics: 85 Chemistry: 76",
        "Hope Williams 1478978 Math: 89 English: 85 Physics: 76"
    ]
    # 批量解析所有行
    parsed_data = [parse_single_student(line) for line in raw_data]
    # 导出逗号分隔CSV
    export_file(parsed_data, "student_score.csv", separator=",")
    # 导出竖线分隔格式文件
    export_file(parsed_data, "student_score.txt", separator="|")

代码说明

  • 解析逻辑兼容整数、小数类型的成绩,自动过滤冗余的空白字符
  • 缺考科目自动填充-1,输出列顺序完全匹配需求要求的固定表头
  • 只需修改separator参数即可切换逗号、竖线两种输出格式
  • 支持批量处理任意行数的原始文本数据,可直接对接从TXT文件逐行读取的输入源

内容的提问来源于stack exchange,提问作者Việt Thắng

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.09 16:15:02