如何将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
相关产品推荐
相关产品推荐

