python:序列化
在很多时候,我们需要把代码运行产生的数据存储到固定的文本文件中,但是,仅仅使用python中原装的文件读写方法是难以实现的。
就像用write()
方法,只能够写入字符串,读取的时候也是以字符串的形式读取,如果我们储存的是数组或字典,处理起来会非常麻烦。
在这种时候,我们就需要用到序列化
序列化
定义
把变量从内存中变成可存储或传输的过程称之为序列化;序列化需要使用pickle库
import pickle as pk
pickle库中的使用方法:
pickle.dumps()
方法把任意对象序列化成一个bytes,然后,就可以把这个bytes写入文件pickle.dump()
方法直接把对象序列化后写入一个file-like Objectpickle.loads()
方法将bytes反序列化出对象pickle.load()
方法将file-like Object反序列化出对象
由于序列化后,内容转变为字节,打开和写入有所改变:
With open('1.txt','wb' or 'rb') as fp:
#快捷打开表达式
序列化只能用在python中,而且不同版本之间不兼容。
dumps()用法:
My = '123456789'
Pk_data = pk.dumps(My)
My序列化后的字节就会存储在pk_data中。
dump()用法
With open(<文件位置>,'wb') as fp:
pk.dump(My,fp)
将My序列化后存储进文件中
loads()用法
with open(<文件位置>,'rb') as fp:
a = fp.read()
pk_data = pk.loads(a)
print(pk_data)
将文件内容读取到a中,反序列化a后储存到pk_data中
load()用法
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()
方法,就只能够反序列化一个数据,第二个数据小编想尽方法都显示不出来…
以上就是本章的全部内容了,感谢各位的观看!