python中常用的序列化模块_如何序列化处理数据?真的会用pickle吗?python中常用模块详解...

在编程中我们经常会遇到这样的需求:将一串数据或者有效信息暂存在本地(一般情况下这种数据量并不大,当数据量较大时,可以选择使用temp文件存储方式,参见一个项目引发的思考,如何操作临时文件?Python中的内置模块实现)。

0df431adcbef7609da017373395a4ec97dd99e65.jpeg?token=59f6d6e852eb181d081b66e5c0950188&s=95B06D33594EE8CE025191CE0100D0B1数据序列化和反序列化处理

这类处理是很常见的,比如,一个程序的配置文件,记录程序的信息,便于下次打开程序将该信息提取出来(信息的持久化存储);从程序内存中读取的数据加载到本地后,如果下次该程序还想继续在别的机器上面使用,只需要提供相同的环境,即可在别的地方使用这些数据(跨平台进行数据交互)。这两个特点是序列化和反序列化处理数据的优点所在。

cf1b9d16fdfaaf51be238abb94d379ebf11f7a7a.jpeg?token=729b37c33906fa1e6edaeb92d0fe7f1f&s=2820ED1259F74FA545FCA8C20200A0A3是有优势的哦

在Python中,我们一般使用pickle、json、xml、shelve等处理方式。有时,我们甚至可以将这些信息存储成文本格式,但这样有点low……其实,对于序列化处理(稍后会讲),很多人脑海中并没有很准确的概念,比如什么时候该用哪种模块?这些模块有何优缺点?

0ff41bd5ad6eddc4a5e75f4f215c5bf85366338b.jpeg?token=65de619c085e22e1b811426dd8bc1b4a&s=0D26FD171CB066805B1C09E50300E023什么时候用呢?

本次我们的主题是以Python中最常使用的json和pickle模块为例,深入探讨Python在处理此类问题时,模块的应用范围和优缺点,本次分为三个章节进行讨论。今天,我们详解pickle模块的使用。

什么是序列化?

简单来讲,就是把一个对象(变量)或者任何形式的数据结构从内存中变成可存储对象或进行传输的过程,我们称之为序列化。序列化在python中称为pickle,这个过程就是我们前面描述的需求。

3801213fb80e7becf784e11937a9543d9a506b7d.jpeg?token=bb2e22338aa41c20bd06f73d2815f4a5&s=28E27A22DC99A28E7BBC04DA0100C091文档中怎么说?

pickle序列化存储信息的方式

首先,导入pickle模块,该模块是内置模块,不需要我们进行安装(json也一样)

import pickle

我们来看一下pickle为我们提供了哪些接口函数

print(' '.join([i for i in dir(pickle) if not i.startswith('_')]))

8644ebf81a4c510fba5732b278dec828d52aa510.jpeg?token=59294e3eb72d99ac182fdc070269ac98&s=2C42FB02E3FB298044DD6507000080C2pickle模块的方法和常用变量

很多方法,但是,我们知道,序列化处理最为重要的就是将信息序列化存储在本地;然后将其读取出来,这应该是常用的操作,上面我们红线框出来的四个方法就是我们今天重点要讨论的内容。

3ac79f3df8dcd100052432366a0caa15b8122ffe.jpeg?token=289f7f25de6f637bd35dc999a95e2e5a&s=18267D334B2265240CD541DA000080B1如何使用?

pickle.dump(obj, file, protocol=None, *, fix_imports=True)

【作用】将obj的pickled对象写入打开的文件对象file中

obj:是需要序列化处理的对象

file:文件对象,必须有一个write()方法,该方法接受一个字节参数。因此,它可以是为二进制文件打开的文件对象写入、io.BytesIO实例或其他自定义对象。

protocol:告诉pickler对象使用给定的协议,它能够支持的协议有0、1、2、3、4。违约协议是3,为Python 3设计的向后不兼容协议。貌似是为了兼容性考虑的一个参数,不常用。

fix_imports:如果*fix_imports*为真且协议小于3,pickle将尝试将新的Python 3名称映射到Python中使用的旧模块名称2,这样pickle数据流可以用Python 2读取。也是为了兼容性考虑,这里不做赘述了。默认设置可以达到兼容需求。

pickle.dumps(obj, protocol=None, *, fix_imports=True)

【作用】将对象的pickled表示形式(obj)返回为bytes对象。

参数同pickle.dump方法

pickle.load(file, *, fix_imports=True, encoding='ASCII', errors='strict')

这里并没有protocol参数,这是因为pickle的协议版本是自动检测的,超过pickled对象的字节数表示将被忽略。

【作用】从存储在文件中的pickle数据读取并返回对象

file:必须有两个方法,一个read(intNumber)方法和一个readline()方法。两个方法都应该返回字节,因此该参数可以是打开要读取的二进制文件对象、io.BytesIO对象或任何符合条件的自定义对象。

fix_imports、encoding、errors:这三个参数可选,用于控制pickle流的兼容性支持。如果fix-imports为真,pickle将尝试将旧的Python 2名称映射到Python 3中使用的新名称。encoding、errors参数告诉pickle如何解码8位字符串,默认解码方式和容错机制为“ASCII”和“strict”。也是为了兼容性考虑,不常用。

pickle.loads(data, *, fix_imports=True, encoding='ASCII', errors='strict')

【作用】从给定的pickle数据读取并返回对象。

参数作用用法参照pickle.loads()方法。

文档令人望而却步

上面的讲解大多摘自Python中有关pickle模块的文档,我对部分内容进行了简化处理。怎么样?有没有被吓到,仅仅是这样的序列化处理,内容将近几千字,看懵了之后,才会发现,其实它很简单,读这个文档又浪费了不少时间……

241f95cad1c8a786388cbad0708e243872cf50d3.jpeg?token=062073ac4837a6635e9f7d33e705ab9d&s=48211D724113D9C41AFC95CA0000E0B1再简单一点

我来简化一下吧:

dump或者dumps是序列化操作(处理的数据(内存)>>pickled对象或文件),load或者loads是反序列化操作(pickled对象或文件 >> 获取的数据(内存));两种操作中加s和不加s的区别在于:不加s的函数中传入数据和文件对象,直接可以进行序列化和反序列化操作;加s只是传入需要处理或获取的数据,然后对数据进行序列化或者反序列化操作。举例来看一下区别

8644ebf81a4c510fa25219e577dec828d62aa5cc.jpeg?token=cea34dc8f84f183962ed4a0470ad44d2&s=5C218655ACD22C41008985730300D0F3举例说明

序列化一个数据

定义一个函数:

def pickleUse():

print('pickle dumps and loads test')

# 导入模块

import pickle

# 创建一个可写的文件对象

f = open('test.pk', 'wb')

# dumps仅仅是进行序列化操作 数据-->pickled对象

result = pickle.dumps(pickleUse)

result

>>>b'\x80\x03c__main__\npickleUse\nq\x00.'

# dump却可以实现将数据转化为pickled对象,然后存入到本地文件的功能(自动实现)。

result2 = pickle.dump(pickleUse, f)

print(result2)

>>>None

不会返回内容。

反序列化一个数据

# 创建一个可读文件对象

f = open('test.pk', 'rb')

# 同理,load文件中的数据,不需要执行f.read()方法

data = pickle.load(f)

print(data)

>>>

# 函数成功执行

data()

>>>pickle dumps and loads test

# 使用loads函数需要将文件中数据读取出来

data = pickle.loads(f.read())

print(data)

>>>

# 将pickled对象加载到内存中之后,正确执行函数

data()

>>>pickle dumps and loads test

好了,今天的内容就到这里了,这项技能你Get到了吗?下一篇我们将详细讨论json的用法,感兴趣的朋友们加关注。还有没有别的序列化处理的方法呢?欢迎大家留言讨论。

转载请注明出处,百家号:python高手养成

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值