Python 登录帐户错误

Python 登录帐户错误,python,Python,我正在尝试建立一个基于文本的帐户系统。基本上,用户创建一个账户,并将信息保存到名为账户的字典中。每个帐户有两部分,用户名和密码。将信息保存到帐户字典时,它将保存为帐户[newusername]=newpassword。无论如何,我做的登录功能不起作用,我输入的任何东西都不起作用,它只是说我输入的东西是错误的 这是我的登录码: def login(): username = "" password = "" print "\n------------------------

我正在尝试建立一个基于文本的帐户系统。基本上,用户创建一个账户,并将信息保存到名为账户的字典中。每个帐户有两部分,用户名和密码。将信息保存到帐户字典时,它将保存为帐户[newusername]=newpassword。无论如何,我做的登录功能不起作用,我输入的任何东西都不起作用,它只是说我输入的东西是错误的

这是我的登录码:

def login():
    username = ""
    password = ""
    print "\n--------------------------------------------"
    print "\n Would you like to login?"
    yesorno = raw_input("\n Please enter YES or NO: ")
    if yesorno.lower() == "no":
        print "\n--------------------------------------------"
        startup()
    elif yesorno.lower() == "yes":
        while username == "":
            username = raw_input("\n Please enter your username: ")
        while password == "":
            password = raw_input("\n Please enter your password: ")
        for usernames in accounts:
            if username.lower() == usernames.lower():
                for passwords in accounts.values():
                    if password == passwords:
                        print "\n Access Granted"
                        print "\n--------------------------------------------"
                        menu()
                    else:
                        pass
                    print "\n Access Denied"
                    print "\n Please try again"
                    login()
            else:
                pass
            print "\n Access Denied"
            print "\n Please try again"
            login()
    else:
        login()
下面是我的完整代码:

import datetime
import time
import pickle

filesfile = "filesfiles"
accountfile = "accountsfiles"

accounts = {}
files = {}

accountsaver = open(accountfile,'r')
accounts = pickle.load(accountsaver)
accountsaver.close()

filesaver = open(filesfile,'r')
files = pickle.load(filesaver)
filesaver.close()

def startup():
    accountsaver = open(accountfile,'wb')
    pickle.dump(accounts, accountsaver)   
    accountsaver.close()
    print "\n          -------------------          "
    print "          FILE SYSTEM MANAGER          "
    print "          -------------------          "
    print "\n To login type in: LOGIN"
    print " To create a new account type in: ACCOUNT"
    loginornew = raw_input("\n Please enter LOGIN or ACCOUNT: ")
    if loginornew.lower() == "login":
        login()
    elif loginornew.lower() == "account":
        newaccount()
    else:
        startup()

def newaccount():
    newusername = ""
    newpassword = ""
    newpasswordagain = ""
    print "\n--------------------------------------------"
    print "\n Would you like to create a new account?"
    yesorno = raw_input("\n Please enter YES or NO: ")
    if yesorno.lower() == "no":
        print "\n--------------------------------------------"
        startup()
    elif yesorno.lower() == "yes":
        while newusername == "":
            newusername = raw_input("\n Please enter a username for your account: ")
        while newpassword == "":    
            newpassword = raw_input(" Please enter a password for your account: ")
        while newpasswordagain == "":
            newpasswordagain = raw_input(" Please confirm the password for your account: ")
        if newpassword == newpasswordagain:
            for username in accounts:
                if username.lower() == newusername.lower():
                    print "\n Username already exists"
                    print " Please try again"
                    newaccount()
                else:
                    pass
            accounts[newusername] = newpassword
            print "\n Account Created"
            print "\n--------------------------------------------"
            startup()
        else:
            print "\n Passwords do not match"
            print " Please try again"
            newaccount()
    else:
        newaccount()

def login():
    username = ""
    password = ""
    print "\n--------------------------------------------"
    print "\n Would you like to login?"
    yesorno = raw_input("\n Please enter YES or NO: ")
    if yesorno.lower() == "no":
        print "\n--------------------------------------------"
        startup()
    elif yesorno.lower() == "yes":
        while username == "":
            username = raw_input("\n Please enter your username: ")
        while password == "":
            password = raw_input("\n Please enter your password: ")
        for usernames in accounts:
            if username.lower() == usernames.lower():
                for passwords in accounts.values():
                    if password == passwords:
                        print "\n Access Granted"
                        print "\n--------------------------------------------"
                        menu()
                    else:
                        pass
                    print "\n Access Denied"
                    print "\n Please try again"
                    login()
            else:
                pass
            print "\n Access Denied"
            print "\n Please try again"
            login()
    else:
        login()

在python中,每个函数都有自己的名称表,这基本上意味着在函数完成后,任何变量的任何更改都将丢失。如果要更改所谓的全局变量(全局命名空间中的变量,函数外部的变量)而不是局部变量(例如函数命名空间中的变量),首先必须将其声明为全局变量:

def foo():
    global accounts
    accounts = "whatever"
这是主要问题。但您的代码仍然无法正常工作:
按照您的操作方式,用户名和密码不必匹配,只需在您的帐户中记录,在任何位置:

for usernames in accounts: #Iteration over all usernames
            if username.lower() == usernames.lower():
                for passwords in accounts.values(): #Iteration over all passwords
                    if password == passwords:
                        print "\n Access Granted"
                        print "\n--------------------------------------------"
                        menu()
你最好这样解决:

for account in accounts.items():
    if account[0] == username and account[1] == password:
        print "\n Access Granted!!!"
还有一个问题:(函数:newaccount())

要执行的操作:重新启动函数。但是在这里,您正在重新启动已经运行的函数中的函数。在#[1]成功完成后,您的程序将在#[1]之后的行继续,并更改已存在用户的密码。(这不应该,是吗?)

要解决此问题,只需在else部分中插入正确的代码,并在函数的另一个实例正在执行作业时中断for循环:

for username in accounts:
                if username.lower() == newusername.lower():
                    print "\n Username already exists"
                    print " Please try again"
                    newaccount()
                    break #!!!
                else: #!!
                    accounts[newusername] = newpassword
                    print "\n Account Created"
                    print "\n--------------------------------------------"
                    startup()
…希望我的意思很清楚

for username in accounts:
                if username.lower() == newusername.lower():
                    print "\n Username already exists"
                    print " Please try again"
                    newaccount()
                    break #!!!
                else: #!!
                    accounts[newusername] = newpassword
                    print "\n Account Created"
                    print "\n--------------------------------------------"
                    startup()