今天用python写了一个用户登录验证的小程序,算是对python面对对象编程的一个小练习,因为在做用户账户储存更新的过程中多次用到了pickle模块,也接触到了不少坑点,所以决定写下来,方便日后学习
好了,闲话不多说,开始今天的正题:
python的pickle模块实现了基本的数据序列和反序列化。通过pickle模块的序列化操作我们能够将程序中运行的对象信息保存到文件中去,永久存储;通过pickle模块的反序列化操作,我们能够从文件中创建上一次程序保存的对象。
以上是对pickle模块的介绍,简单来说就是将文件对象交给pickle用load()或dump()函数对数据进行序列化和反序列化读写操作
下面开始今天的爬坑之旅:
第一个坑点出现在了用户的更新上面:
对用户数据进行更新后,用pickle.load()函数进行反序列化时只能读取到第一块数据,后面写入的数据无法读取,刚开始以为是python写入读取文件时的模式设置错误,后经多次实验发现问题出现在更新数据后,pickle会在末尾加上结束符,所以反序列化时当读取到结束符时,就停止读取后面的内容,认为文件已经读取完毕,解决方案如下:
循环读取文件内容,直至程序抛出异常
第二个坑点是在用户登陆后对时间戳的更新上:
当更新时间戳后将数据再次写入文件,当第二次读取时,数据由列表变成了列表内嵌套一个列表,用原来的方式循环遍历数据时,提示报错,无法遍历,解决方案如下:
完整的程序代码如下:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import time
import pickle
class Database**(object):** def **__init__(self, name, passwd):** self.name = name self.passwd = passwd self.flag = False def update**(self, name, passwd):** self.name = name self.passwd = passwd self.time = str**(time.time())** tm = self.name + ':' + self.passwd + ':' + self.time self.tmp = file**('db.txt'**, **'ab')** self.db = pickle.dump**(tm, self.tmp, True)** self.tmp.close**()** def check**(self):** self.tmp = file**('db.txt', 'rb'****) a = [] while True:** try**:** self.db = pickle.load**(self.tmp)** a.append**(self.db)** except**:** self.tmp.close**()** break if len**(a)** > 1**:** for i in range**(len(a)):** if self.name == a**[i].split(':')[0]:** if self.passwd == a**[i].split(':')[1]:** print "login success" print a**[i].split(':')[2]** Database.__del__(self, a, i) else**:** a = a**[0]** for i in range**(len(a)):** if self.name == a**[i].split(':')[0]:** if self.passwd == a**[i].split(':')[1]:** print "login success" if self.name == **'admin':** self.flag = True print "Welcome my admin" Database.__del__(self, a, i) def __del__(self, a, i): self.time = time.time**()** a**[i] =** self.name + ':' + self.passwd + ':' + str**(self.time)** self.tmp = file**('db.txt'**, **'wb')** self.db = pickle.dump**(a, self.tmp, True)** self.tmp.close**()** def admin**(self):** if self.flag == True**:** n = raw_input**("Do you want to see all the acount?(yes/no)")** if n == **'yes':** self.tmp = file**('db.txt'**, **'rb')** a = [] while True**:** try**:** self.db = pickle.load**(self.tmp)** a.append**(self.db)** except**:** break print a else**:** print "ok,maybe next time"if __name__ == '__main__'****: name = raw_input('Enter your name:') passwd = raw_input**('Enter your passwd:')** m = Database**(name, passwd)** # m.update('guest', 'guest') m.check**()** m.admin**()**