python记录_day22 序列化
序列化是指把内存里的数据类型转换成字符串,以使其能存储到硬盘或通过网络传输到远程,因为硬盘和网络传输时只能接受bytes
一、pickle
把python对象写入到文件中的一种解决方案,但是写入到文件的是bytes. 所以这东西不是给人看的. 是给机器看的.
##
bs = pickle.dumps(obj) 把对象转为bytes
obj = pickle.loads(bs) 把bytes转为对象
pickle.dump(obj,fielname) 把对象写入到文件
obj = pickle.load(filename) 从文件中拿对象
1 import pickle 2 3 class Cat: 4 def __init__(self,color,name): 5 self.name = name 6 self.color = color 7 8 def he(self): 9 print("喝水") 10 11 def chi(self): 12 print("%s吃小鱼" % self.name) 13 c = Cat('黑','小花') 14 print(c) 15 16 bs = pickle.dumps(c) #将对象转为bytes 17 # print(bs) 18 19 cc = pickle.loads(b'x80x03c__main__ Cat qx00)x81qx01}qx02(Xx04x00x00x00nameqx03Xx06x00x00x00xe5xb0x8fxe8x8axb1qx04Xx05x00x00x00colorqx05Xx03x00x00x00xe9xbbx91qx06ub.' 20 ) #将bytes转为对象 21 # pickle.loads 是拿着bytes的存储的对象信息和类的地址再去造一个对象,如果类增加了方法,造的对象也会具有该方法 22 print(cc) 23 cc.chi() 24 cc.he() # 25 print(cc.name,cc.color) 26 27 28 print("-------写入文件-------------") 29 pickle.dump(c,open("cat.txt",mode="wb")) #将对象写到文件中 30 #Write a pickled representation of the given object to the open file. 31 32 c2 = pickle.load(open("cat.txt",mode="rb")) #从文件拿到对象 33 c2.chi() 34 print(c2.name) 35 36 print("------写入多个-------") 37 c1 = Cat("黑","小黑") 38 print(c1) 39 c2 = Cat('白','大白') 40 c3 = Cat('灰','灰灰') 41 lst = [c1,c2,c3] 42 43 pickle.dump(lst,open("duocat.txt",mode="wb")) 44 45 l = pickle.load(open("duocat.txt",mode='rb')) 46 for dc in l: 47 dc.chi() 48 print(dc)
二、shelve
shelve提供python的持久化操作。什么叫持久化操作呢? 就是把数据写到硬盘上。在操作shelve的时候非常的像操作一个字典。
d = shelve.open('文件名') #打开文件,会自动生成一个 .dat 文件
d[key] =value #赋值
d[key] #拿值
d[key] = newvalue #修改
d.close() #关闭文件
注意:
修改shelve文件时要加writeback =True ,这是让内存中数据回写到文件。
1 import shelve 2 3 # d = shelve.open("shelve") 4 # d["小数据库"]= "shelve" 5 # d.close() 6 7 d = shelve.open("shelve") 8 print(d['小数据库']) 9 d.close() 10 11 #修改 12 d = shelve.open('shelve') 13 d['小数据库'] = '字典' 14 d.close() 15 16 c = shelve.open('shelve') 17 print(c['小数据库']) 18 c.close() 19 20 #存储复杂字典 21 # di = shelve.open('shelve') 22 # di['wf'] = {"name":"汪峰",'wife':{'name':'章子怡','hobby':'看电影'}} 23 # di.close() 24 # 25 # dp = shelve.open('shelve') 26 # print(dp['wf']) 27 # dp.close() 28 29 #修改复杂字典 30 31 di = shelve.open('shelve',writeback=True) # 32 di['wf']['wife']['hobby'] ="听音乐" 33 di.close() 34 35 dp = shelve.open('shelve') 36 print(dp['wf']) 37 dp.close()