在很多时候,我们需要把代码运行产生的数据存储到固定的文本文件中,但是,仅仅使用python中原装的文件读写方法是难以实现的。
就像用write()
方法,只能够写入字符串,读取的时候也是以字符串的形式读取,如果我们储存的是数组或字典,处理起来会非常麻烦。
在这种时候,我们就需要用到序列化
把变量从内存中变成可存储或传输的过程称之为序列化;序列化需要使用pickle库
import pickle as pk
pickle.dumps()
方法把任意对象序列化成一个bytes,然后,就可以把这个bytes写入文件
pickle.dump()
方法直接把对象序列化后写入一个file-like Object
pickle.loads()
方法将bytes反序列化出对象
pickle.load()
方法将file-like Object反序列化出对象
由于序列化后,内容转变为字节,打开和写入有所改变:
With open('1.txt','wb' or 'rb') as fp: #快捷打开表达式
序列化只能用在python中,而且不同版本之间不兼容。
My = '123456789' Pk_data = pk.dumps(My)
My序列化后的字节就会存储在pk_data中。
With open(<文件位置>,'wb') as fp: pk.dump(My,fp)
将My序列化后存储进文件中
with open(<文件位置>,'rb') as fp: a = fp.read() pk_data = pk.loads(a) print(pk_data)
将文件内容读取到a中,反序列化a后储存到pk_data中
With open(<文件位置>,'rb') as fp: Data = pk.load(fp)
将文件fp中的内容反序列化后存储进Data中
总共有两种序列化和两种反序列化,两者并不是一一对应的,可以随意使用,全凭心情~
序列化的时候,可以将所有数据都进行序列化,不同于write()
方法,序列化可以将元组、数组、字典等序列化,在读取反序列的时候可以一步到位!非常的好用!
import pickle as pk#引用pickle库 mes = {'a':1,'b':2} with open('a.txt','wb') as fp: k = pk.dumps(mes)#将mes序列化,并存储至k中 print(k)#打印k print(type(k))#k为一串字节 fp.write(k)#将k写入文本中 with open('a.txt','rb') as fd: k = pk.load(fd)#将文本中内容反序列化 print(k)#打印出反序列化后的内容
若是将多个数据序列化,储存进同一个文本中,在读取反序列化的时候,在反序列化完成第一个后,程序就不再继续反序列化:
import pickle as pk mes1 = {'a':1,'b':2} mes2 = [1,2,3,4] with open('a.txt','wb') as fp: k1 = pk.dumps(mes1) k2 = pk.dumps(mes2) #print(k1) #print(k2) fp.write(k1+k2) with open('a.txt','rb') as fd: k = pk.load(fd) print(k) print(type(k))
结果:
程序并不会一次性将写入的两个数据同时显示出来,若是想要反序列化第二个,需要再次使用pk.load()
,具体如下:
import pickle as pk mes1 = {'a':1,'b':2} mes2 = [1,2,3,4] with open('a.txt','wb') as fp: k1 = pk.dumps(mes1) k2 = pk.dumps(mes2) '''或者: k = pk.dumps(mes1) + pk.dumps(mes2) ''' print(k1) fp.write(k1+k2)#注意:两串字节之间需要使用‘+’连接 ''' #同理,可以使用dump()方法 with open('a.txt','wb') as fp: pk.dump(mes1,fp) pk.dump(mes2,fp) ''' print() with open('a.txt','rb') as fd: k = pk.load(fd) print(k, type(k),sep='\t') k = pk.load(fd) print(k, type(k),sep='\t')
结果:
但是小编发现了一个问题,如果使用pk.loads()
方法,就只能够反序列化一个数据,第二个数据小编想尽方法都显示不出来…
以上就是本章的全部内容了,感谢各位的观看!