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

如何将CSV中的宠物数据行转换为对应类型的对象列表

问题描述

我的CSV文件每行都是宠物数据,示例格式:Fish, Nemo, April 2nd, Goldfish, Orange.
我想要导入该文件,根据**宠物类型(每行首个字符串)**为每个宠物创建对应类型的对象(比如鱼类数据存入Fish对象),再把所有对象存入列表。我尝试了以下代码,但没达到预期:

pets = []
    with open('desktop/cs110/pets.csv', 'r') as file:
        csvReader = csv.reader(file, delimiter=',')
        for row_pets in csvReader:
            pets.append(row_pets)
    columnNames = ['firstCol', 'secondCol', 'thirdColomn']
    lstPets = []
    for row_pets in pets:
        lstPets.append({key: value for key, value in zip(columnNames, row_pets)})
return lstPets
解决方案

你的现有代码存在几个问题:

  • 代码缩进错误(with块前的多余空格会导致语法报错)
  • 定义的columnNames数量和CSV每行的字段数不匹配,导致部分数据丢失
  • 最终只是生成了字典列表,并没有实现按宠物类型创建对应对象的需求

要实现目标,你需要先定义不同的宠物类,再根据CSV数据实例化对应类,具体步骤如下:

1. 定义宠物类

根据CSV里的宠物类型(比如Fish、Dog等)创建对应的类,用类属性存储宠物的各项信息:

class Fish:
    def __init__(self, name, birthday, breed, color):
        self.name = name.strip()  # 去除字段前后的空格
        self.birthday = birthday.strip()
        self.breed = breed.strip()
        self.color = color.strip()

# 如果有其他宠物类型,比如Dog,按同样方式定义
class Dog:
    def __init__(self, name, birthday, breed, color):
        self.name = name.strip()
        self.birthday = birthday.strip()
        self.breed = breed.strip()
        self.color = color.strip()

2. 读取CSV并实例化对象

修改代码,读取CSV时根据每行第一个字段匹配对应的类,创建实例后加入列表:

import csv

def load_pets():
    all_pets = []
    # 建立宠物类型和对应类的映射,方便快速匹配
    pet_type_map = {
        'Fish': Fish,
        'Dog': Dog  # 新增宠物类型时,在这里添加对应类即可
    }

    with open('desktop/cs110/pets.csv', 'r') as file:
        csv_reader = csv.reader(file, delimiter=',')
        for row in csv_reader:
            if not row:  # 跳过空行
                continue
            # 提取并清理宠物类型字段
            pet_type = row[0].strip()
            # 判断当前类型是否有对应的类
            if pet_type in pet_type_map:
                # 提取剩余字段作为类的初始化参数
                name, birthday, breed, color = row[1:]
                # 创建宠物对象并加入列表
                pet_obj = pet_type_map[pet_type](name, birthday, breed, color)
                all_pets.append(pet_obj)
            else:
                # 处理未知宠物类型的情况
                print(f"跳过未知宠物类型的数据:{pet_type}")
    return all_pets

# 调用函数加载所有宠物对象
pets_list = load_pets()

额外说明

  • 用strip()处理每个字段,避免CSV中逗号后的空格导致数据带多余空白字符
  • pet_type_map字典让代码扩展性更强,新增宠物类型时只需添加对应的类和字典条目
  • 增加了空行和未知类型的处理,避免程序运行时出现异常

内容的提问来源于stack exchange,提问作者nina

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 19:20:47