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

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')

解决方案与代码修复

原代码存在的问题

  1. 文件读取逻辑错误:readlines()不能直接绑定到with语句的as变量,会导致后续遍历异常;
  2. 嵌套遍历混乱:内层for digits in csv_file会移动文件指针,导致外层循环跳过大量行;
  3. 无实际验证逻辑:validate_data函数为空,未实现任何规则校验;
  4. 未处理字段拆分:没有将每行数据拆分为单个字段进行逐项校验。

修复后的完整代码

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 21:50:20