2017-02-03 10 views
0

クラスでは、クラスと辞書のsplit()メソッドを利用してセーブ/ロード関数を作成する必要があります。私はsave関数を動作させることができましたが、load関数は私のために働きたくありません。私はそれがほとんど働いているが、保存されたファイルが読み込まれない、またはエラーが表示されますコードが正しく読み込まれないのはなぜですか?

"playerclass"には "player"属性がありません。 の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 
関連する問題