Python有一个序列化过程叫pickle,可以实现任意对象和文本的相互转换,也可以实现任意对象和二进制的相互转换。也就是说,pickle可以实现Python对象的存储和回收。值得一提的是,pickle是python语言的一个标准模块。pickle库在安装python的时候已经安装好了,不需要单独安装。使用import将其导入到程序中,直接使用。pickle模块提供了以下四个函数供我们使用:dumps():将Python中的对象序列化为二进制对象并返回;loads():读取给定的二进制对象数据,并将其转换为Python对象;dump():将Python中的对象序列化为二进制对象,写入文件;load():读取指定的序列化数据文件并返回对象。以上四个函数可以分为两类,其中dumps和loads实现了基于内存的Python对象和二进制之间的转换;dump和load实现基于文件的Python对象和二进制之间的转换。pickle.dumps()函数该函数用于将Python对象转换为二进制对象,其语法格式如下:dumps(obj,protocol=None,*,fix_imports=True)该格式各参数含义为:obj:待转换的Python对象;protocol:pickle转码协议,取值为0、1、2、3、4,其中0、1、2对应Python早期版本,3、4对应Python3.x及之后版本。如果未指定,则默认为3。其他参数:为兼容Python2.x版本保留的参数,Python3.x可以忽略。[例1]importpickletup1=('IlovePython',{1,2,3},None)#使用dumps()函数将tup1转为p1p1=pickle.dumps(tup1)print(p1)输出结果是:b'\x80\x03X\r\x00\x00\x00我喜欢Pythonq\x00cbuiltins\nset\nq\x01]q\x02(K\x01K\x02K\x03e\x85q\x03Rq\x04N\x87q\x05。'pickle.loads()函数该函数用于将二进制对象转换成Python对象,其基本格式如下:loads(data,*,fix_imports=True,encoding='ASCII',errors='strict')其中data参数表示转换二进制对象,其他参数只为兼容Python2.x版本保留,可以忽略。【例2】在例1的基础上,将p1对象反序列化为Python对象。importpickletup1=('IlovePython',{1,2,3},None)p1=pickle.dumps(tup1)#使用loads()函数将p1转换为Python对象t2=pickle.loads(p1)print(t2)运行结果为:('IlovePython',{1,2,3},None)注意在使用loads()函数时to将二进制对象反序列化为Python对象,会自动识别转码协议,所以不需要将转码协议作为参数传入。而且,当要转换的二进制对象的字节数超过腌制的Python对象,多余的字节将被忽略。pickle.dump()函数该函数用于将Python对象转换为二进制文件,其基本语法格式为:dump(obj,file,protocol=None,*,fiximports=True)其中每个的具体含义参数如下:obj:要转换的Python对象。file:转换为指定的二进制文件,要求操作必须用“wb”打开。protocol:与dumps()函数中的protocol参数含义完全相同,这里不再赘述。其他参数:为了兼容之前的Python2.x版本而保留的参数,可以忽略。[示例3]将tup1元组转换为二进制目标文件。importpickletup1=('IlovePython',{1,2,3},None)#使用dumps()函数将tup1转换成p1withopen("a.txt",'wb')asf:#打开文件pickle.dump(tup1,f)#使用dump函数将Python对象转为二进制对象文件运行该程序后,会在程序文件的同级目录下生成一个.txt文件,但由于其内容是二进制数据,所以直接打开会看到乱码。pickle.load()函数该函数对应于dump()函数,用于将二进制目标文件转换为Python对象。该函数的基本语法格式为:load(file,*,fix_imports=True,encoding='ASCII',errors='strict')其中file参数表示要转换的二进制目标文件(必须用"rb打开"operationfile),其他参数仅保留用于与Python2.x版本兼容,可以忽略。【示例4】将示例3中转换的a.txt二进制文件对象转换为Python对象。importpickletup1=('IlovePython',{1,2,3},None)#使用dumps()函数将tup1转换成p1withopen("a.txt",'wb')asf:#打开文件pickle.dump(tup1,f)#使用dump函数将Python对象转换成二进制目标文件withopen("a.txt",'rb')asf:#Openfilet3=pickle.load(f)#Binaryfile该对象被转换为Python对象。print(t3)的结果是:('IlovePython',{1,2,3},None)综上所述,看似强大的pickle模块其实也有缺点,就是pickle不支持并发在一个复杂的系统环境,尤其是读取海量数据时,使用pickle会使整个系统的I/O读取性能成为瓶颈。在这种情况下,可以使用ZODB。ZODB是一个健壮的、多用户的、面向对象的数据库系统,旨在以Python语言存储对象数据。可以存储和管理任意复杂的Python对象,支持事务操作和并发控制。而且ZODB也是在Python的序列化操作的基础上实现的,所以要想有效的使用ZODB,首先要学会pickle。
