泡菜没有正确保存字典

时间:2017-09-08 22:02:57

标签: python python-3.x dictionary

这是我的代码 -

#Using pickle
#using pickle with dictionaries
import pickle
checkDeets = True
passWrong = "You have entered incorrect details, please try again"
x = input("want to enter data? - ")
if x == "yes":
    file = open("data.pickle" , "wb")

    signUpU = input("enter user - ") #Later used as sign in details
    signUpP = input("enter pass - ") # as above

    ID_in = {signUpU : signUpP} #Is meant to store the two user details
    pickle.dump(ID_in, file)
    file.close()

y = input("want to log in? ")
if y == "yes":
    file = open("data.pickle" , "rb")
    ID_out = pickle.load(file)

    while checkDeets == True:

        signInU = input("enter username - ") 
        signInP = input("enter pass - ")
        if signInU in ID_out:

            if signInP == ID_out[signInU][0]:
                print("Login accepted")
                checkDeets = False
            else:
                print("1")
                print(passWrong)
        else:
            print("2")
            print(passWrong)

这是我的输入 -

want to enter data? - yes
enter user - user123
enter pass - pass123
want to log in? no
>>> x = open("data.pickle" , "rb")
>>> x
<_io.BufferedReader name='data.pickle'>   

这最后一部分让我感到困惑,因为我的字典数据似乎没有被保存。这导致我的代码中的部分代码中出现其他错误,其中无法识别用户详细信息。

新的酸洗,对不起,如果有任何明显的错误。使用python 3

1 个答案:

答案 0 :(得分:2)

open()返回一个文件对象,您的repl输出是预期的。如果你想看看它里面的数据包含什么,请将它传递给pickle.load(),如下所示:

want to enter data? - yes
enter user - foo
enter pass - bar
want to log in? no
>>> import pickle
>>> pickle.load(open("data.pickle" , "rb"))
{'foo': 'bar'}
>>>

您可以看到您的数据正在保存和加载而没有问题。由于这个原因,代码的第二部分不起作用:

if signInP == ID_out[signInU][0]:

ID_out[signInU]是一个字符串,即密码,因此ID_out[signInU][0]是该密码的第一个字符。如果密码为“bar”,则该行将“bar”(我们检查的字符串与存储的密码)比较为“b”(存储密码的第一个字母),显然这些字符串不同。只需删除[0],此代码应该是您想要的。