Python新手求助:如何将CSV学生数据集划分至有效/无效列表
学生数据验证与分类问题
我是Python新手,需要处理包含学号、名字、姓氏、出生日期、学习项目的学生数据集,编写程序将数据划分至有效数据列表和损坏数据列表。任何无效或空值判定为损坏数据,需识别标记。
验证规则
- 学号为7位数字,以0开头,第二位为8或9;
- 姓名仅含字母;出生日期格式为YYYY-MM-DD,日期1-31、月份1-12、年份1960-2004;
- 学习项目仅限INF、TINF、CMD、AI。
CSV示例
0893527,Ruggiero,Fifield,1976-08-18,DS 0944991,Vanny,Jerromes,1996-08-10,TINF 0959490,Abbe,Trees,1986-11-29,DS
现有待完善代码
import os import sys valid_lines = [] corrupt_lines = [] def validate_data(line): pass def main(csv_file): with open(os.path.join(sys.path[0], csv_file), newline='').readlines() as csv_file: next(csv_file) for line in csv_file: validate_data(line.strip()) for digits in csv_file: if csv_file[1] != (8,9): print('') print('### VALID LINES ###') print("\n".join(valid_lines)) print('### CORRUPT LINES ###') print("\n".join(corrupt_lines)) if __name__ == "__main__": main('students.csv')
解决方案与代码修复
原代码存在的问题
- 文件读取逻辑错误:
readlines()不能直接绑定到with语句的as变量,会导致后续遍历异常; - 嵌套遍历混乱:内层
for digits in csv_file会移动文件指针,导致外层循环跳过大量行; - 无实际验证逻辑:
validate_data函数为空,未实现任何规则校验; - 未处理字段拆分:没有将每行数据拆分为单个字段进行逐项校验。
修复后的完整代码
import os import sys from datetime import datetime valid_lines = [] corrupt_lines = [] # 定义允许的学习项目集合,查询效率更高 ALLOWED_PROGRAMS = {'INF', 'TINF', 'CMD', 'AI'} def validate_data(line): # 处理空行 if not line: corrupt_lines.append(line) return # 拆分字段,确保有5个字段 fields = line.split(',') if len(fields) != 5: corrupt_lines.append(line) return student_id, first_name, last_name, dob, program = fields # 校验学号:7位数字、以0开头、第二位是8或9 if len(student_id) != 7 or not student_id.isdigit(): corrupt_lines.append(line) return if student_id[0] != '0' or student_id[1] not in ('8', '9'): corrupt_lines.append(line) return # 校验姓名:仅含字母(支持大小写) if not (first_name.isalpha() and last_name.isalpha()): corrupt_lines.append(line) return # 校验出生日期:格式正确、年份1960-2004 try: dob_date = datetime.strptime(dob, '%Y-%m-%d') if not (1960 <= dob_date.year <= 2004): raise ValueError("年份超出范围") except ValueError: corrupt_lines.append(line) return # 校验学习项目 if program not in ALLOWED_PROGRAMS: corrupt_lines.append(line) return # 所有校验通过,加入有效列表 valid_lines.append(line) def main(csv_file): file_path = os.path.join(sys.path[0], csv_file) # 正确打开文件,逐行读取 with open(file_path, 'r', newline='') as f: # 跳过表头(如果CSV没有表头,注释掉这一行) next(f) for line in f: validate_data(line.strip()) # 输出结果 print('### VALID LINES ###') print("\n".join(valid_lines)) print('\n### CORRUPT LINES ###') print("\n".join(corrupt_lines)) if __name__ == "__main__": main('students.csv')
代码说明
- 字段拆分与空值处理:先拆分每行数据,检查字段数量是否符合要求,空行直接标记为损坏数据;
- 学号校验:依次检查长度、是否为纯数字、开头字符和第二位字符是否符合规则;
- 姓名校验:使用
isalpha()方法确保名字和姓氏仅包含字母; - 日期校验:利用
datetime.strptime解析日期,自动验证格式合法性,同时手动校验年份范围; - 学习项目校验:用集合存储允许的项目,通过
in操作快速判断是否合法; - 文件读取修复:正确使用
with语句打开文件,逐行处理,避免指针混乱问题。
内容的提问来源于stack exchange,提问作者BigAmz
相关产品推荐
相关产品推荐

