为什么我的代码无法正确加载?

Why wont my code load properly?

在 class 中,我们必须使用 split() 方法为 class 和字典创建一个 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:")

从您的 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