我现在遇到的问题是,对于使用密钥的字典:存储用户名的值:密码是每次重新运行程序时,当前密钥:值被重置,字典再次设置为空。我的程序的目标是让一个人使用用户名和密码登录,并能够存储笔记和密码(我使用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()
答案 0 :(得分:2)
正如其他人所提到的,您需要将字典保存到文件中并在重新启动程序时加载它。我调整了你的代码以便为我工作并创建了两个函数,一个用于保存字典(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()
答案 1 :(得分:1)
有不同的方法可以做到这一点。我提到两个。
正如您所注意到的,程序完成执行后,程序创建的所有变量都将被删除。
保持这些变量存活的一种方法是使程序保持无限运行;类似于后台进程的东西。这可以通过在while循环while True:
内运行脚本来非常简单地实现,尽管还有更有效的方法。然后,它的变量可以继续存在,因为程序永远不会终止。
但是,这仅适用于您希望始终运行某些内容的情况,例如等待输入的用户界面。大多数情况下,您希望脚本能够运行并且能够完成。
因此,您可以将所需数据输出到文本文件。然后,当您启动程序时,请阅读该文本文件并将信息组织到您的字典中。这将使用open("Your_username_file")
并读取该文件的数据。如果您需要有关如何执行此操作的帮助,有许多关于how to read information from files in Python的教程。
答案 2 :(得分:1)
在你的情况下,如何存储它并不重要,所以最好保持简单并将其存储在类似文本文件的内容中。在任何情况下,您都不希望将帐户存储在内存中,因为您需要让它永远保持运行。
由于这也是在本地运行,无论您如何选择存储密码,任何使用密码的人都可以访问。所以User_a可以检查User_b的帐户和密码。
因此,您需要在存储密码之前加密密码。它并不像听起来那么难。实际上,Python有内置的库来处理它。
快速谷歌搜索返回了一个简单的教程,逐步解释所有这些,check it out。您可能很快就能将它实现到您的代码中。