如何使用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
相关产品推荐
相关产品推荐

