Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何创建一个python字典来存储多个帐户的用户名和密码_Python_Python 3.x_Dictionary_Login_Account - Fatal编程技术网

如何创建一个python字典来存储多个帐户的用户名和密码

如何创建一个python字典来存储多个帐户的用户名和密码,python,python-3.x,dictionary,login,account,Python,Python 3.x,Dictionary,Login,Account,我现在遇到的问题是,对于使用key:value存储username:password的字典,每次我重新运行程序时,当前的key:value都会被重置,字典会再次设置为空。我的程序的目标是让一个人用用户名和密码登录,并能够存储我用python.txt文件完成的注释和密码。然后,下一个人可以过来,创建一个帐户,然后做同样的事情。这是我的代码,我对与我的问题相关的每一行代码都进行了注释: def userPass(): checkAccount = input("Do you have an acco

我现在遇到的问题是,对于使用key:value存储username:password的字典,每次我重新运行程序时,当前的key:value都会被重置,字典会再次设置为空。我的程序的目标是让一个人用用户名和密码登录,并能够存储我用python.txt文件完成的注释和密码。然后,下一个人可以过来,创建一个帐户,然后做同样的事情。这是我的代码,我对与我的问题相关的每一行代码都进行了注释:

def userPass():
checkAccount = input("Do you have an account (Y or N)?")
if (checkAccount == 'N' or checkAccount == 'n'):
    userName = input("Please Set Your New Username: ")
    password = input("Please Set Your New Password: ")
//  if (userName in dictAcc):
        print("Username is taken")
        userPass()
    else:
//      dictAcc[userName] = password 
        print("Congratulations! You have succesfully created an account!")
        time.sleep(1.5)
        dataInput()
elif(checkAccount == 'Y' or checkAccount == 'y'):
    login()
else:
    print("Invalid answer, try again")
    userPass()


def login():
global userName
global password
global tries
loginUserName = input("Type in your Username: ")
loginPass = input("Type in your Password: ")
if (tries < 3):
//  for key in dictAcc:
//      if (loginUserName == key and loginPass == dictAcc[key]):
//          print("You have successfully logged in!")
            dataInput()
        else:
            print("Please try again")
            tries += 1
            login()
        if (tries >= 3):
            print("You have attempted to login too many times. Try again later.")
            time.sleep(300)
            login()

userPass()

有不同的方法可以做到这一点。我会提到两个

正如您所注意到的,当程序完成执行时,程序创建的所有变量都将被删除

使这些变量保持活动状态的一种方法是使程序不确定地运行;有点像后台处理。这可以非常简单地通过在while循环中运行脚本来实现,而True:,尽管也有更有效的方法来实现。然后,它的变量可以继续存在,因为程序永远不会终止

然而,这仅在您希望始终运行某些东西的情况下有用,例如用户界面等待输入。大多数情况下,您希望脚本能够运行并完成


因此,您可以将所需的数据输出到文本文件。然后,当您启动程序时,读取该文本文件并将信息组织到词典中。这将使用openYour_username_文件并读取该文件的数据。如果您需要有关如何执行此操作的帮助,有许多教程。

有不同的方法。我会提到两个

正如您所注意到的,当程序完成执行时,程序创建的所有变量都将被删除

使这些变量保持活动状态的一种方法是使程序不确定地运行;有点像后台处理。这可以非常简单地通过在while循环中运行脚本来实现,而True:,尽管也有更有效的方法来实现。然后,它的变量可以继续存在,因为程序永远不会终止

然而,这仅在您希望始终运行某些东西的情况下有用,例如用户界面等待输入。大多数情况下,您希望脚本能够运行并完成


因此,您可以将所需的数据输出到文本文件。然后,当您启动程序时,读取该文本文件并将信息组织到词典中。这将使用openYour_username_文件并读取该文件的数据。如果您需要关于如何实现这一点的帮助,那么有很多关于如何存储的教程。

在您的案例中,如何存储并不重要,因此最好保持简单,并将其存储在文本文件之类的文件中。在任何情况下,您都不希望将帐户存储在内存中,因为您需要让它永远运行

由于它也在本地运行,因此无论您选择如何存储密码,使用它的任何人都可以访问它。因此,用户a可以检查用户b的帐户和密码

因此,您需要在存储密码之前对其进行加密。这并不像听起来那么难。实际上,Python有内置的库来处理它


快速的谷歌搜索返回了一个简单的教程,一步一步地解释了这一切。您可能能够很快将其实现到代码中。

在您的情况下,如何存储它并不重要,因此最好保持简单,并将其存储在文本文件之类的文件中。在任何情况下,您都不希望将帐户存储在内存中,因为您需要让它永远运行

由于它也在本地运行,因此无论您选择如何存储密码,使用它的任何人都可以访问它。因此,用户a可以检查用户b的帐户和密码

因此,您需要在存储密码之前对其进行加密。这并不像听起来那么难。实际上,Python有内置的库来处理它


快速的谷歌搜索返回了一个简单的教程,一步一步地解释了这一切。您可能能够很快将其实现到代码中。

正如其他人所提到的,您需要将字典保存到文件中,并在重新启动程序时加载它。我调整了您的代码以适合我,并创建了两个函数,一个用于保存字典savedict,另一个用于加载字典loaddict。except IOError部分只是为了在文件不存在时创建一个新文件

请注意,一般来说,将密码存储在文本文件中是一个非常糟糕的主意。您可以清楚地看到,如果您试图打开dictAcc.txt文件,它将拥有所有密码的原因

import pickle
import time

def loaddict():
    try:
        with open("dictAcc.txt", "rb") as pkf:
            return pickle.load(pkf)
    except IOError:
        with open("dictAcc.txt", "w+") as pkf:
            pickle.dump(dict(), pkf)
            return dict()

def savedict(dictAcc):
    with open("dictAcc.txt", "wb") as pkf:
        pickle.dump(dictAcc, pkf)


def userPass():
    dictAcc = loaddict() #Load the dict
    checkAccount = raw_input("Do you have an account (Y or N)?")
    if (checkAccount == 'N' or checkAccount == 'n'):
        userName = raw_input("Please Set Your New Username: ")
        password = raw_input("Please Set Your New Password: ")
        if (userName in dictAcc):
            print("Username is taken")
            userPass()
        else:
            dictAcc[userName] = password 
            print("Congratulations! You have succesfully created an account!")
            savedict(dictAcc) #Save the dict
            time.sleep(1.5)
            # dataInput() Code ends
    elif(checkAccount == 'Y' or checkAccount == 'y'):
        login()
    else:
        print("Invalid answer, try again")
        userPass()


def login():
    global userName
    global password
    global tries
    loginUserName = raw_input("Type in your Username: ")
    loginPass = raw_input("Type in your Password: ")
    dictAcc = loaddict() #Load the dict
    if (tries < 3):
        for key in dictAcc:
            if (loginUserName == key and loginPass == dictAcc[key]):
                print("You have successfully logged in!")
                # dataInput() Code ends
            else:
                print("Please try again")
                tries += 1
                login()
            if (tries >= 3):
                print("You have attempted to login too many times. Try again later.")
                time.sleep(3)
                tries=1 #To restart the tries counter
                login()

global tries
tries=1
userPass()

正如其他人提到的,您需要将字典保存到文件中,并在重新启动程序时加载它。我调整了您的代码以适合我,并创建了两个函数,一个用于保存字典savedict,另一个用于 要加载它,请单击loaddict。except IOError部分只是为了在文件不存在时创建一个新文件

请注意,一般来说,将密码存储在文本文件中是一个非常糟糕的主意。您可以清楚地看到,如果您试图打开dictAcc.txt文件,它将拥有所有密码的原因

import pickle
import time

def loaddict():
    try:
        with open("dictAcc.txt", "rb") as pkf:
            return pickle.load(pkf)
    except IOError:
        with open("dictAcc.txt", "w+") as pkf:
            pickle.dump(dict(), pkf)
            return dict()

def savedict(dictAcc):
    with open("dictAcc.txt", "wb") as pkf:
        pickle.dump(dictAcc, pkf)


def userPass():
    dictAcc = loaddict() #Load the dict
    checkAccount = raw_input("Do you have an account (Y or N)?")
    if (checkAccount == 'N' or checkAccount == 'n'):
        userName = raw_input("Please Set Your New Username: ")
        password = raw_input("Please Set Your New Password: ")
        if (userName in dictAcc):
            print("Username is taken")
            userPass()
        else:
            dictAcc[userName] = password 
            print("Congratulations! You have succesfully created an account!")
            savedict(dictAcc) #Save the dict
            time.sleep(1.5)
            # dataInput() Code ends
    elif(checkAccount == 'Y' or checkAccount == 'y'):
        login()
    else:
        print("Invalid answer, try again")
        userPass()


def login():
    global userName
    global password
    global tries
    loginUserName = raw_input("Type in your Username: ")
    loginPass = raw_input("Type in your Password: ")
    dictAcc = loaddict() #Load the dict
    if (tries < 3):
        for key in dictAcc:
            if (loginUserName == key and loginPass == dictAcc[key]):
                print("You have successfully logged in!")
                # dataInput() Code ends
            else:
                print("Please try again")
                tries += 1
                login()
            if (tries >= 3):
                print("You have attempted to login too many times. Try again later.")
                time.sleep(3)
                tries=1 #To restart the tries counter
                login()

global tries
tries=1
userPass()

顺便说一句,当我使用你的代码时,非常感谢你的帮助,上面写着回溯最近的调用:File/Users//Desktop/LoginProgram.py,第100行,在userPass File/Users//Desktop/LoginProgram.py,第56行,在userPass dictAcc=loaddict File/Users//Desktop/LoginProgram.py中,第15行,在loaddict return pickle.loadpkf eoferor:run out out out input中,我仍然收到错误eoferor:run out out input。我在网上寻找答案,它说要使用except IOError,但它已经在代码中了??对不起,我弄错了。在loaddict函数中,我返回pickle.dump的返回值时使用了一个空dict,而不是实际的空dict。现在应该可以工作了。请注意,您的代码仍然有一些需要调整的地方,以实际正常工作。我只关注与你的问题相关的东西:非常奇怪。它对我很有效。你确定你复制了整个代码吗?还要注意的是,如果文件中有多个用户名,那么您的代码就有一个bug,它会告诉您列表中每个用户名的密码都是错误的。您应该先通过一个循环查找用户名来解决这个问题。然后在循环完成后,您有三个选项:1用户名不存在,2用户名存在但PW错误,或3用户名存在且密码正确。祝你好运附言:有趣来自泡菜。我不会担心的。我正在使用Python3,我不知道这是否重要,我一定会看看循环,谢谢!!!顺便说一句,当我使用你的代码时,非常感谢你的帮助,上面写着回溯最近的调用:File/Users//Desktop/LoginProgram.py,第100行,在userPass File/Users//Desktop/LoginProgram.py,第56行,在userPass dictAcc=loaddict File/Users//Desktop/LoginProgram.py中,第15行,在loaddict return pickle.loadpkf eoferor:run out out out input中,我仍然收到错误eoferor:run out out input。我在网上寻找答案,它说要使用except IOError,但它已经在代码中了??对不起,我弄错了。在loaddict函数中,我返回pickle.dump的返回值时使用了一个空dict,而不是实际的空dict。现在应该可以工作了。请注意,您的代码仍然有一些需要调整的地方,以实际正常工作。我只关注与你的问题相关的东西:非常奇怪。它对我很有效。你确定你复制了整个代码吗?还要注意的是,如果文件中有多个用户名,那么您的代码就有一个bug,它会告诉您列表中每个用户名的密码都是错误的。您应该先通过一个循环查找用户名来解决这个问题。然后在循环完成后,您有三个选项:1用户名不存在,2用户名存在但PW错误,或3用户名存在且密码正确。祝你好运附言:有趣来自泡菜。我不会担心的。我正在使用Python3,我不知道这是否重要,我一定会看看循环,谢谢!!!