2017-02-03 7 views
0

In der Klasse müssen wir eine Speichern/Laden-Funktion erstellen, die die split() -Methode für eine Klasse und ein Wörterbuch verwendet. Ich habe es geschafft, dass die Speicherfunktion funktionierte, aber die Ladefunktion scheint für mich nicht funktionieren zu wollen. Ich bekomme es entweder fast funktioniert, aber die gespeicherte Datei wird nicht geladen, oder ich bekomme den FehlerWarum wird mein Code nicht richtig geladen?

"playerclass" hat keine "Player" -Attribut. muss die Methode init verwenden. Hier ist der Code in seiner Gesamtheit def loaddata(): ist vor allem der Bereich der Besorgnis.

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

Antwort

0

players = {} aus Ihrer loaddata Funktion entfernen, und es wird richtig geladen.

Wenn Sie tatsächlich möchten den Inhalt des Wörterbuchs zum Zurücksetzen beim Laden (was Ihre Absicht gewesen wäre, obwohl ich sagen würde, das ist eine fragwürdige Design-Entscheidung), können Sie tun:

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

Diese ist, weil alle Variablen, in die Sie schreiben, als lokale Variablen (wie in, lokal für die Funktion) angenommen werden, es sei denn, Sie sagen etwas anderes.

Ich könnte etwas übersehen, aber ich sehe nichts, das versucht, ein player Attribut von einem beliebigen Objekt zu lesen, also bin ich nicht sicher, woher der Fehler kommt. War es von einer anderen Version dieses Codes? Oder, wenn es die gepostete Version ist, die diesen Fehler hat, können Sie genau angeben, welche Reihe von Eingaben zu dem Fehler führen?

Der Rest dieser Antwort ist nicht direkt relevant für Ihre Frage, nur ein paar Tipps basierend auf den Dingen, die ich in Ihrem Code bemerkt habe.

Ich würde das entfernen:

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

Weil du sie in __init__ gesetzt und so sind sie überflüssig und nichts zu tun. Für das Schleifen von Zeilen in Dateien können Sie eine for-Schleife verwenden, die besser lesbar ist als while-Schleifen. Beispiel:

for line in infile: 
    print(line) 

Und Sie sollten in with suchen. Es ist eine andere Art von Block, und sie sind sehr nützlich, wenn Sie mit Dateien arbeiten, weil sie die Datei automatisch schließen, wenn der Block endet, also müssen Sie nicht. Als ein Beispiel:

with open("foo", "r") as stream: 
    for line in stream: 
     print(line) 
# stream got implicitly closed because the block ended 
Verwandte Themen