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\x00IlovePythonq\x00cbuiltins\nset\nq\x01]q\x02(K\x01K\x02K\x03e\x85q\x03Rq\x04N\x87q\x05.'pickle.loads()functionthis函数用于将二进制对象转换为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()函数反序列化二进制对象时转成Python对象,会自动识别转码协议,所以不需要传入转码协议作为参数。并且,当要转换的二进制对象的字节数超过pickledPython对象时,多余的字节将被忽略。pickle.dump()函数该函数用于将Python对象转换为二进制文件,其基本语法格式为:dump(obj,file,protocol=None,*,fixmports=True),各参数具体含义如下:obj:要转换的Python对象。file:转换为指定的二进制文件,文件必须以“wb”模式打开才能运行这里。其他参数:为了兼容之前的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:#打开文件t3=pickle.load(f)#转换二进制文件objectintoaPythonobjectprint(t3)运行结果为:('IlovePython',{1,2,3},None)综上所述,看似强大的pickle模块其实也有缺点,就是pickle不支持并发访问持久对象。在系统环境下,尤其是读取海量数据时,使用pickle会使整个系统的I/O读取性能成为瓶颈。在这种情况下,可以使用ZODB。ZODB是一个健壮的、多用户的、面向对象的数据库系统,旨在以Python语言存储对象数据。可以存储和管理任意复杂的Python对象,支持事务操作和并发控制。而且ZODB也是在Python的序列化操作的基础上实现的,所以要想有效的使用ZODB,首先要学会pickle。
