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