我不知道如何将属性从csv文件传递到一个类中,然后从这个类中打印一个特定的属性

w7t8yxp5  于 2023-05-04  发布在  其他
关注(0)|答案(3)|浏览(182)

我对python非常陌生,我试图将属性从csv文件传递到一个类中,然后我试图从那个类中打印一个特定的属性。
这是我的尝试,但我意识到我离正确的解决方案还很远。

import csv

class Pokemon:
    def __init__(self, name, type1, type2, Atk, Def, SpAtk, SpDef, Spd, Health):
        self.name = name
        self.type1 = type1
        self.type2 = type2
        self.Atk = Atk
        self.Def = Def
        self.SpAtk = SpAtk
        self.SpDef = SpDef
        self.Spd = Spd
        self.Health = Health

    def pokeprint(self):
        print(f"{self.Atk}")

Pokemon_list = []

with open('Pokemon.csv', 'r') as f:
    reader = csv.reader(f)
    next(reader, None)
    for row in reader:
        Pokemon_list.append(Pokemon(row[0], row[1], row[2], int(row[3]), int(row[4]), int(row[5]), int(row[6]), int(row[7]), int(row[8])))

pokeprint(Bulbasaur)

下面是csv文件中的几行:

Bulbasaur,Grass,Poison,45,49,49,65,65,45
Ivysaur,Grass,Poison,60,62,63,80,80,60
Venusaur,Grass,Poison,80,82,83,100,100,80
bttbmeg0

bttbmeg01#

一个可能的解决方案是创建一个口袋妖怪字典,其中键是口袋妖怪的名称,值是类Pokemon的示例。例如:

import csv

class Pokemon:
    def __init__(self, name, type1, type2, Atk, Def, SpAtk, SpDef, Spd, Health):
        self.name = name
        self.type1 = type1
        self.type2 = type2
        self.Atk = Atk
        self.Def = Def
        self.SpAtk = SpAtk
        self.SpDef = SpDef
        self.Spd = Spd
        self.Health = Health

    def pokeprint(self):
        print(f"{self.Atk}")

Pokemon_dct = {}

with open('data.csv', 'r', newline='') as f:
    reader = csv.reader(f)
    for row in reader:
        Pokemon_dct[row[0]] = Pokemon(row[0], row[1], row[2], int(row[3]), int(row[4]), int(row[5]), int(row[6]), int(row[7]), int(row[8]))

Pokemon_dct['Bulbasaur'].pokeprint()

图纸:

45
ao218c7q

ao218c7q2#

另一种方法是让每个Pokemon类示例维护一个表示CSV文件中的列和相关值的字典。
重写__str__,使其返回示例字典的字符串表示。
重写__getitem__和__getattr__以给予获取单个列数据的方便机制。
给定一个CSV文件,它看起来像:

name,type1,type2,Atk,Def,SpAtk,SpDef,Spd,Health
Bulbasaur,Grass,Poison,45,49,49,65,65,45
Ivysaur,Grass,Poison,60,62,63,80,80,60
Venusaur,Grass,Poison,80,82,83,100,100,80

那...

import csv

FILENAME = 'Pokemon.csv'

class Pokemon():
    def __init__(self, _dict):
        self._dict = _dict
    def __str__(self):
        return str(self._dict)
    def __getitem__(self, key):
        return self._dict.get(key)
    def __getattr__(self, key):
        return self._dict.get(key)

Pokemon_list = []

with open(FILENAME, newline='', encoding='UTF-8') as data:
    reader = csv.reader(data)
    columns = next(reader)
    for line in reader:
        pc = Pokemon(dict(zip(columns, line)))
        Pokemon_list.append(pc)
        print(pc)
        print(pc['Atk']) # getitem
        print(pc.Atk) # getattr

输出:

{'name': 'Bulbasaur', 'type1': 'Grass', 'type2': 'Poison', 'Atk': '45', 'Def': '49', 'SpAtk': '49', 'SpDef': '65', 'Spd': '65', 'Health': '45'}
45
45
{'name': 'Ivysaur', 'type1': 'Grass', 'type2': 'Poison', 'Atk': '60', 'Def': '62', 'SpAtk': '63', 'SpDef': '80', 'Spd': '80', 'Health': '60'}
60
60
{'name': 'Venusaur', 'type1': 'Grass', 'type2': 'Poison', 'Atk': '80', 'Def': '82', 'SpAtk': '83', 'SpDef': '100', 'Spd': '100', 'Health': '80'}
80
80
im9ewurl

im9ewurl3#

另一种方法使用DictReader并将CSV字段作为参数传递。使用__repr____str__允许类以调试和用户的方式显示自己:

import csv
from pprint import pprint

class Pokemon:
    def __init__(self, name, type1, type2, Atk, Def, SpAtk, SpDef, Spd, Health):
        self.name = name
        self.type1 = type1
        self.type2 = type2
        self.Atk = int(Atk)  # allow int or str to be passed for initialization
        self.Def = int(Def)
        self.SpAtk = int(SpAtk)
        self.SpDef = int(SpDef)
        self.Spd = int(Spd)
        self.Health = int(Health)

    def __repr__(self):  # debug display of class instance
        return (f'Pokemon(name={self.name!r}, '
                f'type1={self.type1!r}, '
                f'type2={self.type2!r}, '
                f'Atk={self.Atk!r}, '
                f'Def={self.Def!r}, '
                f'SpAtk={self.SpAtk!r}, '
                f'SpDef={self.SpDef!r}, '
                f'Spd={self.Spd!r}, '
                f'Health={self.Health!r})')

    def __str__(self):  # pretty display of class instance
        return f'{self.name}({self.type1}/{self.type2})'

with open('Pokemon.csv', 'r') as f:
    reader = csv.DictReader(f)
    Pokelist = {Pokemon(**args) for args in reader} # pass argument dictionary with **

pprint(Pokelist)
for pokemon in Pokelist:
    print(pokemon)

输出:

{Pokemon(name='Bulbasaur', type1='Grass', type2='Poison', Atk=45, Def=49, SpAtk=49, SpDef=65, Spd=65, Health=45),
 Pokemon(name='Ivysaur', type1='Grass', type2='Poison', Atk=60, Def=62, SpAtk=63, SpDef=80, Spd=80, Health=60),
 Pokemon(name='Venusaur', type1='Grass', type2='Poison', Atk=80, Def=82, SpAtk=83, SpDef=100, Spd=100, Health=80)}
Ivysaur(Grass/Poison)
Bulbasaur(Grass/Poison)
Venusaur(Grass/Poison)

相关问题