2017-02-03 67 views
0

在课堂上,我们必须使用类和字典的split()方法创建保存/加载函数。我设法使save函数正常工作,但加载函数似乎不想为我工作。我得到它几乎工作,但保存的文件不加载,或者我得到错误为什么我的代码不能正确加载?

“playerclass”没有“播放器”属性。需要使用init方法。下面是整个代码def loaddata():主要是关注的领域。

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:") 

回答

0

loaddata功能删除players = {},它会正常加载。

如果你真的加载何时复原字典的内容(这可能是你的意图,虽然我会说这是一个可疑的设计决定),你可以这样做:

def loaddata(): 
    global players 
    players = {} 
    ... 

这是因为你写的任何变量都被认为是局部变量(如函数的局部变量),除非你另有说明。

我可能会忽略某些东西,但我没有看到任何尝试从任何对象读取player属性的内容,所以我不确定错误来自哪里。它是否来自此代码的不同版本?或者,如果发布的版本出现该错误,您能准确提供哪些系列输入会导致错误?


该答案的其余部分与您的问题没有直接关系,只是基于我在代码中注意到的一些提示。

我会删除:

name = "" 
phone = "" 
jersey = "" 

因为你在__init__设置它们,所以它们是多余的,没有做任何事情。为了循环遍历文件中的行,可以使用for循环,它比while循环更具可读性。例如:

for line in infile: 
    print(line) 

而你应该看看with。它是另一种类型的块,在处理文件时它们非常有用,因为它们会在块结束时自动关闭文件,所以您不必这样做。举个例子:

with open("foo", "r") as stream: 
    for line in stream: 
     print(line) 
# stream got implicitly closed because the block ended 
相关问题