Python基础(13)——pickle模块的详述(dumps、loads、dump、load的用法)

一、Python提供了 pickle(泡菜) 模块来实现序列化。那什么是序列化?

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

a = {'name':'Bob','age':20,'score':90}

字典 a 可以随时修改变量,比如把 name 改成 'Bill',但是一旦程序结束,变量所占用的内存就被操作系统全部回收。如果没有把修改后的 'Bill'存储到磁盘上,下次重新运行程序,变量又被初始化为 'Bob'

我们把变量从内存中变成可存储或传输的过程称之为序列化,在 Python 中叫 pickling。序列化之后,就可以把序列化后的内容写入磁盘,或者通过网络传输到别的机器上。反过来,把变量内容从序列化的对象重新读到内存里称之为反序列化,即 unpickling。

  • pickle 序列化后的数据,可读性差,人一般无法识别;
  • pickle 模块只能在 python 中使用,且只支持同版本,不能跨平台使用;
  • Python 中所有的数据类型(列表,字典,集合,类等)都可以用 pickle 来序列化。
  • 需导入 pickle 模块 — import pickle

二、pickle模块常用的方法有:dumps、loads、dump、load

1、pickle.dumps(obj) — 把 obj 对象序列化后以 bytes 对象返回,不写入文件

下面代码分别对列表l1、元组t1、字典dic1进行序列化操作,打印后可以看到结果是一堆二进制乱码。代码如下所示:

import pickle
l1=[1,2,3,4,5]
t1=(1,2,3,4,5)
dic1={"k1":"v1","k2":"v2","k3":"v3"}

res_l1=pickle.dumps(l1)
res_t1=pickle.dumps(t1)
res_dic=pickle.dumps(dic1)

print(res_l1)
print(res_t1)
print(res_dic)

对数据进行序列化操作后,打印数据得到结果为:
b'\x80\x03]q\x00(K\x01K\x02K\x03K\x04K\x05e.'
b'\x80\x03(K\x01K\x02K\x03K\x04K\x05tq\x00.'
b'\x80\x03}q\x00(X\x02\x00\x00\x00k1q\x01X\x02\x00\x00\x00v1q\x02X\x02\x00\x00\x00k2q\x03X\x02\x00\x00\x00v2q\x04X\x02\x00\x00\x00k3q\x05X\x02\x00\x00\x00v3q\x06u.'

2、pickle.loads(bytes_object) — 从 bytes 对象中读取一个反序列化对象,并返回其重组后的对象

下面代码是先分别对列表l1、元组t1、字典dic1进行序列化,然后再对序列化后的对象进行反序列化操作,打印后可以看到序列化之前是什么类型的数据,反序列化后其数据类型不变。代码如下所示:

import pickle
l1=[1,2,3,4,5]
t1=(1,2,3,4,5)
dic1={"k1":"v1","k2":"v2","k3":"v3"}

res_l1=pickle.dumps(l1)
res_t1=pickle.dumps(t1)
res_dic=pickle.dumps(dic1)

print(pickle.loads(res_l1),type(pickle.loads(res_l1)))
print(pickle.loads(res_t1),type(pickle.loads(res_t1)))
print(pickle.loads(res_dic),type(pickle.loads(res_dic)))

打印序列化后的数据及其类型,得到结果为:
[1, 2, 3, 4, 5] <class 'list'>
(1, 2, 3, 4, 5) <class 'tuple'>
{'k1': 'v1', 'k2': 'v2', 'k3': 'v3'} <class 'dict'>

3、pickle.dump(obj , file) — 序列化对象,并将结果数据流写入到文件对象中

下面代码分别把 列表l1、元组t1、字典dic1 进行序列化操作,并保存到一个文件中以实现永久保存。代码入下所示:

import pickle
l1=[1,2,3,4,5]
t1=(1,2,3,4,5)
dic1={"k1":"v1","k2":"v2","k3":"v3"}
#把列表l1序列化进一个文件f1中
with open("f1","wb") as f:
    pickle.dump(l1,f)
    pickle.dump(t1,f)
    pickle.dump(dic1,f)

序列化后在当前目录下生成一个f1文件,打开文件f1可以看到一堆乱码,如下所示:
€]q (KKKKKe.€(KKKKKtq .€}q (X   k1qX   v1qX   k2qX   v2qX   k3qX   v3qu.

4、pickle.load(file) — 反序列化对象,将文件中的数据解析为一个Python对象

下面代码是先对列表l2进行序列化并保存到文件f2中,然后再对文件f2进行反序列化,得到文件f2里保存的数据

import pickle
l2=[1,2,3,4,5,6]
#把列表l2序列化进一个文件f2中
with open("f2","wb") as f:
    pickle.dump(l1,f)
with open("f2","rb") as f:
    res=pickle.load(f)
    print(res,type(res))
    
反序列化之后,打印数据及其类型可以看到:
[1, 2, 3, 4, 5, 6] <class 'list'>

 

  • 58
    点赞
  • 190
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
安装_pickle模块不需要单独操作,因为_picklePython的内置模块。_pickle模块用于序列化对象,即将对象转换成字节流以便存储或传输。在Python中使用_pickle模块可以方便地将对象持久化保存到磁盘上,并在需要时将其读取出来恢复成原来的对象。 在使用Python 3时,默认已经自带_pickle模块,无需进行额外的下载和安装。可以直接在代码中通过`import pickle`来导入_pickle模块,然后使用_pickle模块的相关函数进行对象的序列化和反序列化操作。 常用的_pickle模块函数包括: - dumps(obj):将对象序列化为字节流 - loads(data):将字节流反序列化为对象 - dump(obj, file):将对象序列化并保存到文件中 - load(file):从文件中读取字节流并将其反序列化为对象 在导入_pickle模块后,就可以使用上述函数进行对象的序列化和反序列化操作了。例如,可以使用dumps函数将对象转换成字节流并打印出来,然后使用loads函数将字节流转换回对象。 需要注意的是,使用_pickle模块进行对象的序列化和反序列化时,可能会存在一些安全风险,因为_pickle模块可以执行任意的Python代码。如果需要在不可信的环境下进行对象序列化和反序列化操作,建议使用更安全的序列化模块,如JSON模块。 总之,Python 3已经内置了_pickle模块,可以直接导入并使用相关函数进行对象的序列化和反序列化操作,无需额外的下载和安装。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值