python:序列化

python:序列化

在很多时候,我们需要把代码运行产生的数据存储到固定的文本文件中,但是,仅仅使用python中原装的文件读写方法是难以实现的。

就像用write()方法,只能够写入字符串,读取的时候也是以字符串的形式读取,如果我们储存的是数组或字典,处理起来会非常麻烦。

在这种时候,我们就需要用到序列化

序列化

定义

把变量从内存中变成可存储或传输的过程称之为序列化;序列化需要使用pickle库

import pickle as pk

pickle库中的使用方法:

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中,而且不同版本之间不兼容。

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))

结果:
python:序列化
程序并不会一次性将写入的两个数据同时显示出来,若是想要反序列化第二个,需要再次使用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')

结果:
python:序列化

但是小编发现了一个问题,如果使用pk.loads()方法,就只能够反序列化一个数据,第二个数据小编想尽方法都显示不出来…

以上就是本章的全部内容了,感谢各位的观看!

上一篇:1、输出函数print()


下一篇:C语言程序设计大作业 酒店管理系统 课程设计