微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

结果:

运行结果1

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

结果:

运行结果2

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐