# 序列化:存储或传输数据时,把对象处理成方便存储和传输的数据格式,这个过程即为序列化
# Python中序列化的三种方案:
# 1.pickle python任意数据——》bytes写入⽂件;写好的bytes——》python的数据.
# 2.shelve 简单另类的⼀种序列化⽅案. 可以作为⼀种⼩型的数据库来使⽤
# 3.json 将字典列表转换成字符串,前后端数据交互高频使用的⼀种数据格式
# pickle:
# 写入到文件的是bytes
# pickle中的dumps可以序列化⼀个对象.loads可以反序列化⼀个对象
1 import pickle 2 class Cat: 3 def __init__(self,name,color): 4 self.name = name 5 self.color =color 6 7 def chi(self): 8 print("%s猫会吃老鼠"%(self.name)) 9 10 c = Cat("加菲","橘色") 11 # c.chi() 12 bs = pickle.dumps(c) # 把对象转换成bytes 13 # print(bs) # b'\x80\x03c__main__\nCat\nq\x00)\x81q\x01}q\x02(X\x04\x00\x00\x00nameq\x03X\x06\x00\x00\x00\xe5\x8a\xa0\xe8\x8f\xb2q\x04X\x05\x00\x00\x00colorq\x05X\x06\x00\x00\x00\xe6\xa9\x98\xe8\x89\xb2q\x06ub.' 14 15 # 把bytes反序列化成对象 16 cc = pickle.loads(b'\x80\x03c__main__\nCat\nq\x00)\x81q\x01}q\x02(X\x04\x00\x00\x00nameq\x03X\x06\x00\x00\x00\xe5\x8a\xa0\xe8\x8f\xb2q\x04X\x05\x00\x00\x00colorq\x05X\x06\x00\x00\x00\xe6\xa9\x98\xe8\x89\xb2q\x06ub.') 17 cc.chi() 18 print(cc.name,cc.color) # 加菲猫会吃老鼠 加菲 橘色
# dump load读写文件操作
# dump load ⼀个对象写读到文件
1 c = Cat("加菲","橘色") 2 pickle.dump(c,open("cat.dat",mode = 'wb')) # 把对象写到文件 pickle.dump() 注意bytes用wb模式 3 ccc = pickle.load(open('cat.dat',mode='rb')) # 把对象读取出来 pickle.load() 注意bytes用rb模式 4 ccc.chi() # 加菲猫会吃老鼠 5 print(ccc.name,ccc.color) # 加菲 橘色
# pickle用list读写多个对象
1 c1 = Cat("加菲1","橘色") 2 c2 = Cat("加菲2","橘色") 3 c3 = Cat("加菲3","橘色") 4 c4 = Cat("加菲4","橘色") 5 c5 = Cat("加菲5","橘色") 6 7 # lst = [c1,c2,c3,c4,c5] 8 # f = open('cat.dat',mode='wb') 9 # pickle.dump(lst,f) # 把lst写到f 10 11 f = open('cat.dat',mode='rb') 12 lis = pickle.load(f) # 把lis从f读取出来 13 for cc in lis: 14 cc.chi()
# 应用:pickle实现注册登录
1 import pickle 2 3 4 class User: 5 def __init__(self,username,password): 6 self.username = username 7 self.password = password 8 9 10 class Client: 11 # 注册 12 def regist(self): 13 uname = input("请输入你的账户:") 14 pwd = input("请输入你的密码:") 15 user = User(uname,pwd) # 把uname pwd 传参到User类 16 pickle.dump(user,open("userinfo",mode='ab')) # 把对象保存到userinfo 17 print("注册成功!") 18 19 # 登录 20 def login(self): 21 uname = input("请输入你的账户:") 22 pwd = input("请输入你的密码:") 23 f = open('userinfo',mode='rb') 24 while 1: 25 # 加入try except 当不存在的账户登录时 抛出错误 26 try: 27 u = pickle.load(f) # 从userinfo中读取出用户 28 if u.username == uname and u.password == pwd: 29 print("登陆成功!") 30 break 31 except Exception as e: 32 print("登录失败!") 33 break 34 35 d = Client() 36 # print("注册") 37 # d.regist() 38 # d.regist() 39 # d.regist() 40 # print("登录") 41 # d.login() 42 # d.login() 43 # d.login()
# shelve 就是把数据写到硬盘上.操作shelve非常的像操作字典.
1 import shelve 2 3 d = shelve.open("test") # 可理解成文件类型的字典 4 # d['wf'] = '汪峰' 5 d['wf'] = '王菲' 6 print(d['wf']) # 汪峰 王菲 7 d.close()
# 存储一些复杂点的数据
1 import shelve 2 d = shelve.open('test') 3 d['wf'] = {'name':'汪峰','age':47,'wife':{'name':'章子怡','hobby':'拍电影'}} 4 print(d['wf']) # 运行结果 {'name': '汪峰', 'age': 47, 'wife': {'name': '章子怡', 'hobby': '拍电影'}} 5 d.close() 6 7 # 尝试修改 8 d = shelve.open('test') 9 d['wf']['wife']['name'] = '小章' 10 print(d['wf']) # 运行结果 {'name': '汪峰', 'age': 47, 'wife': {'name': '章子怡', 'hobby': '拍电影'}} 11 d.close() 12 # 坑 由上可知 直接修改没效果 需用到 writeback
# writeback=True 可动态的把修改的信息写入到⽂件中.
1 d = shelve.open('test',writeback=True) # 文件类型字典修改时 writeback 把修改回写到文件 2 d['wf']['wife']['hobby'] = '搓麻将' # 修改vlue 3 d.close() 4 5 d = shelve.open('test') 6 print(d['wf']) # 运行结果 {'name': '汪峰', 'age': 47, 'wife': {'name': '章子怡', 'hobby': '搓麻将'}} 7 d.close()
continue...