注册
登录
查看:401 | 回复:11
鹏笑
求助大佬:无法在 IDLE 中用 pickle 或 shelve 模块保存变量和打开变量
发表于 2023/5/31 13:21:22
楼主

编写了一个简单的密码管理器,可以进行密码的添加、查询和修改,其中有一个列表是用来储存用户输入的网站用户密码信息的。

问题是:想保存那个保存了用户网站信息的变量,以方便下次用户打开这个 py 文件执行程序的时候这些用户输入的数据仍在,用户可以进行后续操作而不是重新输入所有内容,因为重新输入的话这个密码管理器就没有意义。

我在网页上搜索了很多文档,但是得到的信息都是像这样的:

import pickle 
myList=[ a ,123111,[4,5,True]] 
f=open ( mylist.pickle , wb ) # b: 一定要以二进制的方式打开 
pickle.dump(myList,f) 
f.close()


鹏笑
发表于 2023/5/31 13:25:54
沙发

问题 1:

比如这里的列表 myList,列表里面已经有需要保存的值。而我的程序里的列表创建时是一个空列表,它的值是等待用户输入的。

当然,在程序执行以后,用户可能确实会输入一些内容。


鹏笑
发表于 2023/5/31 13:29:55
板凳

问题 2:

网上看到的代码都是如同上述代码这样很简单,但是我不明白的是变量的保存是单独创建一个 py 文件写上面这种代码还是在我现在的程序里面加上这些代码?

如果是在现有程序里面写保存变量的代码?它应该如何写呢?


鹏笑
发表于 2023/5/31 13:31:13
4楼

问题 3: 当我下次要继续使用这些代码的时候,我是在 IDLE 里打开这个 py 文件按 F5,里面的变量就是已经保存好可以用(上次的值已经存在),还是要进行其他操作上次的值才能调出来呢?


鹏笑
发表于 2023/5/31 13:32:02
5楼

以下是我的代码:

`    这是一个密码管理器    
    每次程序结束,程序中的变量会全部被销毁    
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( 对不起,您输入的选项无效,请重新输入. )


pardon
发表于 2023/5/31 13:35:29
6楼

其实你用 pickle 模块,与用读写文件的思路是一样的。

所不同的是 pickle 是 python 自带的序列化与反序列化工具,它所产生的是可执行的 python 代码字符串。

另外使用 input 这种需要在控制台交互编程,通常都是即用即走,换句话来讲就是数据一次性用完就丢。

pardon
发表于 2023/5/31 13:38:35
7楼

当然如果想要下次打开,再次使用上次数据,你需要将帐号密码之类持久化(存储)下来,存储在文件,数据库等都可以,然后每次打开程序先读入文件内的数据,或给一个入口,让可读列表或字典或元组,然后迭代让用户选择。



pardon
最佳答案 发表于 2023/5/31 13:42:07
8楼

想来,你只是不知道如何使用 pickle 模块存取数据,简单用法如下


image.png


pardon
发表于 2023/5/31 13:43:46
9楼

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


鹏笑
发表于 2023/5/31 13:46:21
10楼

谢谢大佬

请问pickle.load()出来的那个列表(从文件里),与程序里创建的那个空列表名字是相同的,因为pickle就是把程序里那个列表序列化了,那么读取出来以后,程序再次运行,最开始那个空列表依然是空的,while循环里的用户输入数据到底会继续保存到空列表里还是保存到load())出来的列表里呢?


pardon
发表于 2023/5/31 13:47:26
11楼

想保存本次新增或修改的结果,就调用pickle.dump,想读取之前的数据,

则必须在文件大循环之前使用pickle.load加载 ,或者使用全局变量。

如果不清楚,想想你是怎样将数据存取文件的操作流程 。

每一次保存操作本质上都是变量写入(存入)文件的同步操作,而读取相反。

换句话而言,不想每次都重新输入帐号密码就存下来,想的话就不用考虑存不存的问题了。

若嫌麻烦 可考虑用shelve模块,配置自动回写关键字即可


立即注册站大爷用户,免费试用全部产品
立即注册站大爷用户,免费试用全部产品