Python如何将CSV文件直接映射到自定义Subject类?
解决方案:CSV映射到自定义Subject/Student类
一、标准库csv手动映射(无额外依赖)
完全使用Python内置库实现,符合作业无数据库、仅用CSV的要求。先定义你的类结构,再逐行读取CSV并实例化对象:
class Subject: def __init__(self, subject_name, grade, prof_name, details): self.subject_name = subject_name self.grade = grade self.prof_name = prof_name self.details = details class Student: def __init__(self, name, subjects): self.name = name self.subjects = subjects # 读取CSV并映射为对象 import csv students = {} # 假设CSV列顺序为:name,subject_name,grade,prof_name,details with open('students_subjects.csv', mode='r', encoding='utf-8') as file: reader = csv.DictReader(file) for row in reader: # 实例化Subject对象 subject = Subject( subject_name=row['subject_name'], grade=row['grade'], prof_name=row['prof_name'], details=row['details'] ) # 按学生姓名分组,构建Student对象 student_name = row['name'] if student_name not in students: students[student_name] = Student(name=student_name, subjects=[]) students[student_name].subjects.append(subject) # 最终得到Student对象列表 student_list = list(students.values())
二、用dataclasses简化类定义(Python 3.7+)
利用dataclasses自动生成初始化方法,代码更简洁,还能直接用字典解包实例化:
from dataclasses import dataclass import csv @dataclass class Subject: subject_name: str grade: str # 若为数字可改为float/int prof_name: str details: str @dataclass class Student: name: str subjects: list[Subject] # 读取CSV逻辑 students = {} with open('students_subjects.csv', mode='r', encoding='utf-8') as file: reader = csv.DictReader(file) for row in reader: # 直接通过字典解包创建Subject,要求CSV列名与类字段完全匹配 subject = Subject(**row) student_name = row['name'] if student_name not in students: students[student_name] = Student(name=student_name, subjects=[]) students[student_name].subjects.append(subject) student_list = list(students.values())
三、第三方库pydantic(带类型校验)
如果需要严格的字段类型校验、自动类型转换(比如把CSV字符串转为数字),可以用pydantic(需先执行pip install pydantic安装):
from pydantic import BaseModel import csv class Subject(BaseModel): subject_name: str grade: float # 自动将CSV中的字符串转为浮点数 prof_name: str details: str | None = None # 可选字段,允许为空 class Student(BaseModel): name: str subjects: list[Subject] # 读取CSV并处理 students = {} with open('students_subjects.csv', mode='r', encoding='utf-8') as file: reader = csv.DictReader(file) for row in reader: # pydantic自动校验字段类型,不符合会抛出明确错误 subject = Subject(**row) student_name = row['name'] if student_name not in students: students[student_name] = Student(name=student_name, subjects=[]) students[student_name].subjects.append(subject) student_list = list(students.values())
内容的提问来源于stack exchange,提问作者user1079065
相关产品推荐
相关产品推荐

