Python 为什么我的代码不能正确加载?
在类中,我们必须为类和字典使用split()方法创建一个save/load函数。我设法让save函数工作,但是load函数似乎不想为我工作。我要么让它几乎工作,但保存的文件没有加载,要么我得到的错误 “玩家类”没有“玩家”属性。需要使用init方法。下面是全部代码def loaddata():主要是关注的领域Python 为什么我的代码不能正确加载?,python,class,dictionary,split,load,Python,Class,Dictionary,Split,Load,在类中,我们必须为类和字典使用split()方法创建一个save/load函数。我设法让save函数工作,但是load函数似乎不想为我工作。我要么让它几乎工作,但保存的文件没有加载,要么我得到的错误 “玩家类”没有“玩家”属性。需要使用init方法。下面是全部代码def loaddata():主要是关注的领域 class playerclass: name = "" phone = "" jersey = "" def __init__(self, name, p
class playerclass:
name = ""
phone = ""
jersey = ""
def __init__(self, name, phone, jersey):
self.name = name
self.phone = phone
self.jersey = jersey
def setname(self, name):
self.name = name
def setphone(self, phone):
self.phone = phone
def setjersey(self, jersey):
self.jersey = jersey
def getname(self):
return self.name
def getphone(self):
return self.phone
def getjersey(self):
return self.jersey
def disroster(self):
print("Player Bio")
print("-----------")
print("Name: ", self.name)
print("Phone #: ", self.phone)
print("Jersey #: ", self.jersey)
def savedata (players):
filename = input("Enter file name: ")
print("Saving....")
outFile = open(filename, "wt")
for x in players.keys():
name = players[x].getname()
phone = str(players[x].getphone())
jersey = str(players[x].getjersey())
outFile.write(name+","+phone+","+jersey+"\n")
print("Save Complete")
outFile.close()
def loaddata ():
players = {}
filename =input("Enter filename to load: ")
inFile = open(filename, "rt")
print("Loading.....")
while True:
inLine = inFile.readline()
if not inLine:
break
inLine = inLine [:-1]
name, phone, jersey = inLine.split(",")
players[name] = playerclass(name, phone, jersey)
print("Load Successfull.")
inFile.close()
return players
def roster(players):
if len(players) == 0:
print("No players on roster: ")
else:
for x in players.keys():
players[x].disroster()
def add_player (players):
newName=input("Enter name of player to add: ")
newPhone = int(input("Enter phone number of player: "))
newJersey = int(input("Enter number of assigned jersey: "))
players[newName]= playerclass(newName, newPhone, newJersey)
return players
def ed_player (players):
oldName = input("Enter players name to edit: ")
if oldName in players:
newName = input("Enter new name for player: ")
newPhone = int(input("Enter new phone number for player: "))
newJersey = int(input("Enter newly assigned jersey number: "))
players[oldName] = playerclass(newName, newPhone, newJersey)
return players
def del_player(players):
delName = input("Enter players name to delete from roster: ")
if delName in players:
del players[delName]
return players
def displayMenu():
print("-------Main Menu-------")
print("1. Display Team Roster.")
print("2. Add Member.")
print("3. Remove Member.")
print("4. Edit Member.")
print("5. Save Data.")
print("6. Load Data.")
print("9. Exit Program.")
return input("Menu Choice: ")
print("Team Management Tools.")
players = {}
menu_choice = displayMenu()
while menu_choice != '9':
if menu_choice == '1':
roster(players)
elif menu_choice == '2':
players = add_player (players)
elif menu_choice == '3':
players = del_player (players)
elif menu_choice == '4':
players = ed_player (players)
elif menu_choice == '5':
savedata (players)
elif menu_choice == '6':
loaddata ()
menu_choice = displayMenu()
print("Updating roster Goodbye:")
从
loaddata
函数中删除players={}
,它将正确加载
如果您确实希望在加载时重置词典的内容(这可能是您的意图,尽管我认为这是一个有问题的设计决策),您可以执行以下操作:
def loaddata():
global players
players = {}
...
这是因为除非您另有说明,否则您写入的任何变量都假定为局部变量(如函数的局部变量)
我可能忽略了某些内容,但我没有看到任何试图从任何对象读取player
属性的内容,因此我不确定错误来自何处。它是否来自此代码的不同版本?或者,如果发布的版本存在该错误,您能否提供导致该错误的确切输入序列
这个答案的其余部分与您的问题没有直接关系,只是基于我在代码中注意到的一些提示 我会删除:
name = ""
phone = ""
jersey = ""
因为您在\uuuu init\uuuu
中设置了它们,所以它们是冗余的,不做任何事情。对于文件中的行循环,可以使用For循环,它比while循环更可读。例如:
for line in infile:
print(line)
您应该使用查看。这是另一种类型的块,它们在处理文件时非常有用,因为它们会在块结束时自动关闭文件,所以您不必这样做。例如:
with open("foo", "r") as stream:
for line in stream:
print(line)
# stream got implicitly closed because the block ended