我正在尝试将数据从Excel工作表导入到RPG游戏的类实例列表中。目前,我正在尝试使用Pandas,这是我一直在使用的代码:python 3.7.2

import pandas as pd


class potion(object):

    def __init__(self, name, types, effects, value, weight):
        self.name = name
        self.types = types
        self.effects = effects
        self.value = value
        self.weight = weight

df = pd.read_excel('Data/potions.xlsx', sheet_name='None')

potions = df.values.tolist()

print(potions)


输出为:

[['Crude Hp Potion', 'Hp Potion', 10, 10, 0.5], ['Hp Potion', 'Hp Potion',
   25, 50, 1.0], ...]


我正在寻找的示例是要存储的数据,如下所示,因此每一行都是实例列表的索引:

potions = [potion('Crude Hp Potion', 'Hp Potion', 10, 10, 0.5),
           potion('Hp Potion', ' hp Potion', 25, 50, 1.0)]


实现我尝试过的方法:

for i in potions[0]:
    potions.append([potion(i)])

print(potions[0].name)


并给了我:

TypeError: __init__() missing 4 required positional arguments: 'types', 'effects', 'value', and 'weight'


我正在使用的Excel工作表上的数据如下:

                 Name       Type  Effect  Price  Weight
0     Crude Hp Potion  Hp Potion      10     10     0.5
1           Hp Potion  Hp Potion      25     50     1.0
2  Superior Hp Potion  Hp Potion      50    100     1.5
3     Crude Mp Potion  Mp Potion       5      5     0.5
4           Mp Potion  Mp Potion      15     50     1.0
5  Superior Mp Potion  Mp Potion      30    100     1.5


我不确定自己想念的是什么,希望得到帮助,我似乎找不到任何地方可以解释如何做。
谢谢。

最佳答案

您非常接近,您只需要解压缩potion列表内列表中的所有值即可。可以用星号(*)完成。这样,您的药水对象将被称为potion(arg1, arg2, arg3, arg4, arg5),这是正确的,而不是potion([arg1, arg2, arg3, arg4, arg5]),这会引起您发现的错误(因为列表代表单个对象)。

以下代码纠正了此问题:

class Potion(object):
def __init__(self, name, types, effects, value, weight):
    self.name = name
    self.types = types
    self.effects = effects
    self.value = value
    self.weight = weight

df = pd.read_excel('Data/potions.xlsx', sheet_name='None')

potions = df.values.tolist()
potion_instances = []
for p in potions:
    potion_instances.append(Potion(*p))


我随意修改了您的结构。首先,为您的对象指定更有意义的名称,以免引起混淆-potionpotions非常接近,按照惯例,Python类始终以CamelCase编写。同样,遍历列表potions并将每个创建的Potion对象附加到新列表(我命名为potion_instances)中更有意义。这样,您可以将原始数据和代码对象彼此分开。

08-05 15:09