无法在 IDLE 中用 pickle 或 shelve 模块保存变量和打开变量的问题咨询。

我编写了一个简单的密码管理器,可以进行密码的添加、查询和修改,其中有一个列表是用来储存用户输入的网站用户密码信息的。我的问题是:我想保存那个保存了用户网站信息的变量,以方便下次用户打开这个py文件执行程序的时候这些用户输入的数据仍在,用户可以进行后续操作而不是重新输入所有内容,因为重新输入的话这个密码管理器就没有意义。
我在网页上搜索了很多文档,但是得到的信息都是像这样的:
import pickle
myList=['a',123111,[4,5,True]]
f=open('mylist.pickle','wb') # b:一定要以二进制的方式打开
pickle.dump(myList,f)
f.close()

问题1:
比如这里的列表myList,列表里面已经有需要保存的值。而我的程序里的列表创建时是一个空列表,它的值是等待用户输入的。当然,在程序执行以后,用户可能确实会输入一些内容。
问题2:
网上看到的代码都是如同上述代码这样很简单,但是我不明白的是变量的保存是单独创建一个py文件写上面这种代码还是在我现在的程序里面加上这些代码?如果是在现有程序里面写保存变量的代码?它应该如何写呢?
问题3:
当我下次要继续使用这些代码的时候,我是在IDLE里打开这个py文件按F5,里面的变量就是已经保存好可以用(上次的值已经存在),还是要进行其他操作上次的值才能调出来呢?
以下是我的代码:
`'''这是一个密码管理器'''
'''每次程序结束, 程序中的变量会全部被销毁'''
list1=[] #创建一个空列表
choice=None
while choice!='0':
list2=[]#创建一个空列表,用以储存用户输入的网站密码等内容
print("""请选择你要进行的操作,并输入对应数字.
0 - exit
1 - 添加网站的用户名和密码
2 - 查询密码
3 - 修改密码
""")
choice=input("请输入对应数字选择您要进行的操作:") #等待用户输入
if choice=='0':
print("Good-bye.")
elif choice=='1':
Website_name=input("请输入网站简称:")
for i in list1:
if(Website_name == i[0]):
print("该网站用户名已经存在.", i, "\n")
continue
list2.append(Website_name)
Website=input("请输入网址:")
list2.append(Website)
User_name=input("请输入用户名:")
list2.append(User_name)
password=input("请输入密码:")
list2.append(password)
list1.append(list2) #将list2的内容储存到list1
print(list2)
elif choice=='2':
search=input("请输入您要查询的内容(输入网站简称查找):") #只能根据网站简称查找内容
flag = True
for i in list1:
if(search in i[0]): #既可全称又可关键字
print("您查找的结果是:", "网站简称: " + i[0] + " 网址:" + i[1] + " 用户名:" + i[2] + " 密码:" + i[3])
flag = False
if(flag):
print("对不起,您查找的内容不存在.")
elif choice=='3':
print(list1)
change_search=input("请输入您要修改密码的网站简称:")
for i in list1:
if (change_search == i[0]):

-1 表示 取最后一个元素

              print("原密码是:", i[-1])
              i[-1] = input("请输入新密码:")
              print("新密码是:", i[-1])
  else:
      print("对不起,您输入的选项无效,请重新输入.")

`期待您的解答,谢谢。

pardon110
最佳答案

其实你用pickle模块,与用读写文件的思路是一样的。所不同的是pickle是python自带的序列化与反序列化工具,它所产生的是可执行的python代码字符串。另外使用input这种需要在控制台交互编程,通常都是即用即走,换句话来讲就是数据一次性用完就丢。当然如果想要下次打开,再次使用上次数据,你需要将帐号密码之类持久化(存储)下来,存储在文件,数据库等都可以,然后每次打开程序先读入文件内的数据,或给一个入口,让可读列表或字典或元组,然后迭代让用户选择。想来,你只是不知道如何使用pickle模块存取数据,简单用法如下

import pickle

mylist = [{'name':'zhangsang','password':'123'},{'name':'lisi','password':'456'}];
f = open('mylist.pickle', 'wb') 
# 持久化存储变量到文件mylist.pickle
pickle.dump(mylist, f)
f.close()

r = open('mylist.pickle', 'rb') 
# 从文件读取二进行制数据,可以将此步骤设置为保存或记住帐号密码的功能 
c = pickle.load(r)
r.close()
print(c)

观察一下变量 mylist 与变量 c 的区别,一个当前脚本产生的数据,另一个本质上是从文件中读取的数据。查看当前脚本路径下是不是多了个 mylist.pickle文件

4年前 评论
pengxiaojessi (楼主) 4年前
pardon110 (作者) 4年前
讨论数量: 1
pardon110

其实你用pickle模块,与用读写文件的思路是一样的。所不同的是pickle是python自带的序列化与反序列化工具,它所产生的是可执行的python代码字符串。另外使用input这种需要在控制台交互编程,通常都是即用即走,换句话来讲就是数据一次性用完就丢。当然如果想要下次打开,再次使用上次数据,你需要将帐号密码之类持久化(存储)下来,存储在文件,数据库等都可以,然后每次打开程序先读入文件内的数据,或给一个入口,让可读列表或字典或元组,然后迭代让用户选择。想来,你只是不知道如何使用pickle模块存取数据,简单用法如下

import pickle

mylist = [{'name':'zhangsang','password':'123'},{'name':'lisi','password':'456'}];
f = open('mylist.pickle', 'wb') 
# 持久化存储变量到文件mylist.pickle
pickle.dump(mylist, f)
f.close()

r = open('mylist.pickle', 'rb') 
# 从文件读取二进行制数据,可以将此步骤设置为保存或记住帐号密码的功能 
c = pickle.load(r)
r.close()
print(c)

观察一下变量 mylist 与变量 c 的区别,一个当前脚本产生的数据,另一个本质上是从文件中读取的数据。查看当前脚本路径下是不是多了个 mylist.pickle文件

4年前 评论
pengxiaojessi (楼主) 4年前
pardon110 (作者) 4年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!