Python 序列化和反序列化的应用--cPickle

1.序列化的作用

在程序运行过程中,所有的变量都是加载到内存中的,比如定义一个dict:

d = dict(name='Bob', age=20, score=88)

可以随时修改变量,比如把name改成’Bill’,但是一旦程序结束,变量所占用的内存就被操作系统全部回收。如果没有把修改后的’Bill’存储到磁盘上,下次重新运行程序,变量又被初始化为’Bob’。
我们把变量从内存中变成可存储或传输的过程称之为序列化,在Python中叫pickling。序列化之后,我们可以把序列化之后的 变量存入磁盘,进行永久存储;等待我们后续需要用到这个变量的时候,就可以把这个序列化变量重新加载到内存中供我们使用。

2.python中序列化和反序列的实现方式

在python中序列化的包是cPickle。定义序列化和反序列化的方法:

import cPickle

def write_to_pkl(data,filename):
    with open(filename, "wb") as fw:
        cPickle.dump(data, fw)

def read_from_pkl(filename):
    with open(filename,'rb') as fr:
        data = cPickle.load(fr)
    return data

其中write_to_pkl方法是把变量序列化,然后存入某个临时pkl文件中去;read_from_pkl方法是把pkl反序列化,加载到我们的内存中来。
下面具体的例子来说明:

class Person:
    def __init__(self, name, age, job):
        self.name = name
        self.age = age
        self.job = job

    def work(self):
        print(self.name, 'is working...')

a_person = Person('abc', 22, 'waiter')

write_to_pkl(a_person,'test.pkl')

data=read_from_pkl('test.pkl')
print  data.work()
#返回结果:('abc', 'is working...')

上面的代码,我们定义了一个测试类。首先把a_person这个实例序列化之后存入我们的本地文件test.pkl。然后再反序列化,把实例重新加载到内存,并调用实例的work()方法。结果发现程序可以按照我们的预想正确执行。
以上是我们对类的实例进行序列化的demo。实际过程中,对于dict,list等各种常用的数据类型,我们都可以利用类似的方法,对其序列化和反序列化。

3.序列化的常用场景

在大数据分析领域,我们利用python,比如pandas框架把数据加载到内存中,并且对其做了一些分析,这个会产生一些中间结果。此时,这些中间结果是保存在内存中,这样子是不安全的,随时有丢失的可能性。这个时候,我们就可以对其序列化了,存入本地磁盘中,后续想进一步对这些中间结果做分析时,可以重新反序列化到内存中来。

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 技术黑板 设计师:CSDN官方博客 返回首页