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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 00:40:08