天天看点

python——pickle模块(用于Python对象的持久化存储)pickle模块介绍

pickle模块介绍

pickle是一种用于存储的持久化技术

首先从英文来理解一下这个模块:pickle 是腌渍的意思,也就是把东西腌起来保存成文件,要用的时候读出来洗洗还能用。

专业点的说法是:pickle是python序列化的一个工具!可以用来把对象来以文件的形式存储起来,用的时候再加载!

注意:pickle模块只能在python中使用,python中的几乎所有的数据类型都可以序列化!但是序列化以后得到的文件人看不懂!

pickle模块内部实现了用于序列化和反序列化Python对象结构的二进制协议

“Pickling”是将python对象层次结构转换成为字节流

“unpickling”是反向操作,即字节流(二进制文件或者类似字节的对象)转换成python对象层次结构。

主要方法

模块中有两个主要的函数:dump()与load()

dump()函数

作用:实现python对象的序列化,将obj保存到file中

具体语法:

pickle.dump(obj, file[, protocol])
           

obj:需要持久化保存的对象

file:将对象序列化以后保存到的类文件对象

注意:必须有一个

protocol(default=4):可选参数,取值为 0、1、2、3、4、5

其中 0、1、2 对应 Python 早期的版本,3 、4、5 则对应 Python 3.x 版本及之后的版本。未指定情况下,默认为 4。

举个例子:这里来保存一个字典试试看

import pickle
my_dict = {'name':'xuebi','age':24}
with open('text.txt','wb') as f:
    pickle.dump(my_dict,f)
           

执行代码之后,可以看到在当前目录下就有了一个txt文件

python——pickle模块(用于Python对象的持久化存储)pickle模块介绍

点开查看后发现都是乱码,人类确实看不太懂。

python——pickle模块(用于Python对象的持久化存储)pickle模块介绍

dumps()函数

作用:返回一个字符串,而不存入文件

语法:

pickle.dumps(obj[, protocol])
           

接着对我们之前的字典进行存储看一下效果:

import pickle

my_dict = {'name':'xuebi','age':24}
p1 = pickle.dumps(my_dict)
print(p1)
           

对返回值进行打印,可以看到是一个字符串:

b'\x80\x04\x95\x1c\x00\x00\x00\x00\x00\x00\x00}\x94(\x8c\x04name\x94\x8c\x05xuebi\x94\x8c\x03age\x94K\x18u.'

load()函数

作用:用于反序列化,将序列化的对象重新恢复成python对象

具体语法:

pickle.load(file)
           

将刚才存储的文件打开试试:

import pickle
file_path = './text.txt'
with open(file_path,'rb') as f:
    my_dict=pickle.load(f)
    print(my_dict)
    print(type(my_dict))
           

结果如下:

{'name': 'xuebi', 'age': 24}

<class 'dict'>

loads()函数

作用:从字符串中恢复对象。

语法:

pickle.loads(string)
           

试一下加载一下刚才存储的那个字符串:

import pickle

my_dict = {'name':'xuebi','age':24}
p1 = pickle.dumps(my_dict)
t1 = pickle.loads(p1)
print(t1)
           

结果如下:

{'name': 'xuebi', 'age': 24}

Pickler()函数

作用:可以使用该对象调用dunmp 和 load 等方法。

语法:

class pickle.Pickler(file[, protocol])
           

clear_memo()函数:

作用:对于相同的对象,如果不使用clear_memo()方法,那么python只会pickle一次

总结

强大的 pickle 模块,也有它的短板,即 pickle 不支持并发地访问持久性对象,在复杂的系统环境下,尤其是读取海量数据时,使用 pickle 会使整个系统的

I/O

读取性能成为瓶颈。

这种情况下,可以使用 ZODB。

ZODB 是一个健壮的、多用户的和面向对象的数据库系统,专门用于存储 Python 语言中的对象数据,它能够存储和管理任意复杂的 Python 对象,并支持事务操作和并发控制。

并且,ZODB 也是在 Python 的序列化操作基础之上实现的,因此要想有效地使用 ZODB,必须先学好 pickle。