2017-02-03 66 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 
相關問題