目录

0. 概要

1. 一个简单的例子

2. Module Interface

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

2.2 pickle.load(file, *, fix_imports = True, encoding = “ASCII”, errors = “strict”)

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

2.4 pickle.loads(bytes_object, *, fix_imports = True, encoding = “ASCII”, errors = “strict”)

3. Pros and Cons of using Pickle Module


0. 概要

The pickle module is used for implementing binary protocols for serializing and de-serializing a Python object structure.

Python pickle模块是对二进制协议的一种实现,用于对于python中的对象结构进行(正向的)序列化(serialization)和(反向的)解序列化(de-serialization)处理。序列化(serialization)将结构化的python对象(如list, dict等)转化为字节流(byte stream),通常也称为pickling,flattening,或者marshalling. 解序列化处理即将由pickling处理生成的字节流反向变换回原来的python对象,也称为unpickling.

为什么需要序列化处理呢? 一言以蔽之,方便数据在不同的系统等之间进行传输、以及以文件或者数据库的方式进行存储。

本文是关于pickle模块的入门级使用方法介绍。

1. 一个简单的例子

要所使用pickling功能,首先当然是要导入pickle模块。

以下例子将一个列表mylist的内容进行序列化处理后,存储到文件datafile.txt中。pickle.dump()函数直接完成了序列化处理以及写入文件的处理。由于转换成了字节序列,所以只能以二进制的格式存入文件,所以open()命令的选项为'wb',其中b表示binary。

import pickle
mylist = ['a', 'b', 'c', 'd']
with open('datafile.txt', 'wb') as fh:pickle.dump(mylist, fh)

运行正常的话,会生成一个名为datafile.txt的文件,打开看看,是以下这个样子。不出意料的是,因为是二进制格式,所以是无法识别的。

所以,更常见的是不用txt后缀,而是用.pkl或者.pickle等后缀,让人一看就知道这是pickle格式。

接下来看看能不能从datafile.txt中恢复出刚才的数据。

pickled_dat = open ("datafile.txt", "rb")
unpickled = pickle.load(pickled_dat)
print(unpickled)

输出如下,恢复出了原列表数据。

['a', 'b', 'c', 'd']

再看一个对python dict进行序列化和解序列化处理的例子。

staffDict = {1:"Lee",2:"Yao",3:"Zhang",4:"Wang",5:"Liu"}
pickled = open("staffDict.pkl","wb")
pickle.dump(staffDict, pickled)
pickled.close()pickled = open("staffDict.pkl", 'rb')
recoveredStaffDict = pickle.load(pickled)
print(recoveredStaffDict)
Output: {1: 'Lee', 2: 'Yao', 3: 'Zhang', 4: 'Wang', 5: 'Liu'}

符合预期。

以上例子用到了pickle.load()和pickle.dump()两个函数的最基本使用方法,也是pickle模块的最基本有用方法。

2. Module Interface

pickle模块包括以下几个函数和常数定义:

(1) dump(): Serialize an object hierarchy and write into a data file

(2) load(): Reverse processing of dump(). Read pickled data stream from data file and de-serialize.

(3) dumps() – This function is called to serialize an object hierarchy into a data stream instead write it into data file.

(4) loads() – This function is called to de-serialize a data stream.

(5) pickle.HIGHEST_PROTOCOL: 整数值,指定最高支持的协议版本号,被dump()和dumps()使用.

(6) pickle.DEFAULT_PROTOCOL: 当未指定protocol参数时,缺省使用的协议代号

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

这个函数等价于Pickler(file, protocol).dump(obj),函数用于将python对象结果进行序列化处理后写入指定的文件。

可选参数protocol用于指定协议代号,所支持的协议代号从0 to HIGHEST_PROTOCOL(pickle常数).未指定的话,则实用DEFAULT_PROTOCOL,如果指定值为负数的话,则选用HIGHEST_PROTOCOL.

如果参数fix_imports为True且protocol小于等于3, pickle模块将会把新的python3的名字映射到旧的python2的模块名,这样的话,序列化后的数据就可以用python2读取了。python2的消失是注定的虽然还需要一些时间,所以对于初阶用户来说,不太会再碰到python2的东西了,所以不太需要关注这些事情。

以下为pickle.dump()的一个更复杂一些的实用示例。

# pickle.dump()
import pickle
import ioclass SimpleObject(object):def __init__(self, name):self.name = namel = list(name)l.reverse()self.name_backwards = ''.join(l)returndata = []
data.append(SimpleObject('pickle'))
data.append(SimpleObject('cPickle'))
data.append(SimpleObject('last'))# Write to the stream
pickled = open("dump.pkl", 'wb')
for o in data:print ('WRITING: %s (%s)' % (o.name, o.name_backwards))
pickle.dump(data,pickled)
WRITING: pickle (elkcip)
WRITING: cPickle (elkciPc)
WRITING: last (tsal)

2.2 pickle.load(file, *, fix_imports = True, encoding = “ASCII”, errors = “strict”)

该函数等价于Unpickler(file).load(),用于从文件中读取序列化后的数据并进行de-serialize恢复出原python对象层次结构.

Example :

# Python program to illustrate
# pickle.load()# Set up a read-able stream
in_s = io.StringIO(out_s.getvalue())pickled_dat = open("dump.pkl", 'rb')unpickled = pickle.load(pickled_dat)#print(unpickled)for o in unpickled:print ('READ: %s (%s)' % (o.name, o.name_backwards))
READ: pickle (elkcip)
READ: cPickle (elkciPc)
READ: last (tsal)

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

这个函数与dump()的区别在于它将序列化后的数据存储在一个字节流对象(byte-stream object)中。这里的's'指的是stream.

所以它不需要指定文件名。它返回的就是所生成的字节流对象的handle。

Example :

#Pickle.dumps()
import pickledata = [ { 'a':'A', 'b':2, 'c':3.0 } ]
data_string = pickle.dumps(data)
print ('PICKLE:', data_string )
PICKLE: b'\x80\x04\x95#\x00\x00\x00\x00\x00\x00\x00]\x94}\x94(\x8c\x01a\x94\x8c\x01A\x94\x8c\x01b\x94K\x02\x8c\x01c\x94G@\x08\x00\x00\x00\x00\x00\x00ua.'

2.4 pickle.loads(bytes_object, *, fix_imports = True, encoding = “ASCII”, errors = “strict”)

它与dumps()构成一对。直接从pickle序列化后的字节流对象恢复出原始的结构层次。

注意,它多了两个参数,一个是encoding,一个是errors.

Example :

# pickle.loads()
import pickle
import pprintdata1 = [ { 'a':'A', 'b':2, 'c':3.0 } ]
print ('BEFORE:',)
pprint.pprint(data1)data1_string = pickle.dumps(data1)data2 = pickle.loads(data1_string)
print ('AFTER:',)
pprint.pprint(data2)print ('SAME?:', (data1 is data2))
print ('EQUAL?:', (data1 == data2))
BEFORE:
[{'a': 'A', 'b': 2, 'c': 3.0}]
AFTER:
[{'a': 'A', 'b': 2, 'c': 3.0}]
SAME?: False
EQUAL?: True

3. Pros and Cons of using Pickle Module

pickle模块还提供一些Exceptions以及一些导出的类,属于比较进阶的要素,本文暂时就不介绍了。

Pros:

用于存储复杂的数据结构非常方便,使用简单,代码简单。

序列化的数据是二进制数据,不可读,所以也相当于提供一些最初阶的安全措施。

Cons:

python pickle序列化后的数据没有跨语言通用性,其它编程语言无法识别pickle序列化后的数据.

pickle本身没有安全防护能力,不会进行识别是否恶意数据以及给出警告。当你拿到一个pickle数据时,如果不是很确定其来源和安全性,不建议随便进行序列化处理。否则的话可能会招致安全威胁。

[Ref1] Python Pickling

[Ref2] pickle — Python object serialization — Python 3.10.1 documentation

[Ref3] pickle — Python object serialization - GeeksforGeeks

Python Pickle模块入门级使用介绍相关推荐

  1. python中pickle模块的用法_Python中json模块和pickle模块的简单介绍(附示例)

    本篇文章给大家带来的内容是关于Python中json模块和pickle模块的简单介绍(附示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. Python中的json模块和pickl ...

  2. python——pickle模块的详解

    python--pickle模块的详解 介绍 pickle模块实现了用于序列化和反序列化Python对象结构的二进制协议 "Pickling"是将Python对象层次结构转换为字节 ...

  3. 实战篇一 python常用模块和库介绍

    # -_-@ coding: utf-8 -_-@ -- Python 常用模块和库介绍 第一部分:json模块介绍 import json 将一个Python数据结构转换为JSON: dict_ = ...

  4. python pickle模块

    持久性就是指保持对象,甚至在多次执行同一程序之间也保持对象.通过本文,您会对 Python对象的各种持久性机制(从关系数据库到 Python 的 pickle以及其它机制)有一个总体认识.另外,还会让 ...

  5. python——pickle模块的使用

    简介 pickle提供了一个简单的持久化功能.可以将对象以文件的形式存放在磁盘上. pickle模块只能在python中使用,python中几乎所有的数据类型(列表,字典,集合,类等)都可以用pick ...

  6. python中导入模块使用哪个关键字_关于python导入模块的关键字介绍

    关于python导入模块的关键字介绍 发布时间:2020-04-17 10:13:26 来源:亿速云 阅读:101 作者:小新 今天小编给大家分享的是关于python导入模块的关键字介绍,很多人都不太 ...

  7. Python pickle模块:实现Python对象的持久化存储

    Python 中有个序列化过程叫作 pickle,它能够实现任意对象与文本之间的相互转化,也可以实现任意对象与二进制之间的相互转化.也就是说,pickle 可以实现 Python 对象的存储及恢复. ...

  8. python pickle模块安装_python如何安装pickle

    pickle是python语言的一个标准模块,安装python后已包含pickle库,不需要单独再安装. pickle模块实现了基本的数据序列化和反序列化.(推荐学习:Python视频教程) 通过pi ...

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

    pickle模块介绍 pickle是一种用于存储的持久化技术 首先从英文来理解一下这个模块:pickle 是腌渍的意思,也就是把东西腌起来保存成文件,要用的时候读出来洗洗还能用. 专业点的说法是:pi ...

最新文章

  1. 使用Python+OpenCV+detectorn2实现社交距离检测
  2. “比特币耶稣”Roger Ver:比特币现金分叉没有技术论据支持
  3. Cissp-【第6章 安全评估与测试】-2021-3-15(661页-706页)
  4. 微服务架构学习 之 什么是微服务
  5. SAP官网发布的react教程
  6. 深圳大学二本计算机软件,深圳大学是几本(深圳大学是一本还是二本)
  7. IntelliJ IDEA-遇见的问题总结
  8. linux环境中nagios(nagios core)安装?nagios安装?
  9. 在MacOS Big Sur中使用Safari 翻译功能的方法
  10. echart 表格_市政工程表格不会填?市政工程1000个表格模板,一键即可套用
  11. 数据库编程之ODBC编程
  12. 三角函数π/2转化_分析最简单的正弦和余弦三角函数的图像
  13. 麦吉尔电子计算机工程专业好么,多大/UBC/麦吉尔,什么专业最厉害?
  14. 西部数据助手mysql_户外摄影存储好助手 西部数据My Passport Wireless SSD测评
  15. 解密:顺丰是一家什么样的公司?
  16. 三维建模软件的插件安装教程——3D Max
  17. 面试 | 什么是内部类?成员内部类、静态内部类、局部内部类和匿名内部类的区别及作用?
  18. SQL连接的理解和使用(内连接:自然连接等值连接,外连接:左连接右连接全外连接)
  19. atlas mysql_使用Atlas配置MySQL读写分离
  20. 汇编语言的AX,BX,CX,DX,分别表示什么

热门文章

  1. 大学四年庸庸碌碌,我弯道超车上了软件测试
  2. 有1、2、3、4、5数字,能组成多少个互不相同且无重复数字的四位数,都是多少?
  3. 神经网络从被人忽悠到忽悠人(二)
  4. Mysql text 不是mediumtext longtext
  5. android显示动画一直播放器,播放器适配经验总结——Android
  6. 数据库外键为什么被抛弃了?
  7. 英国的善良教育比我们多了几层?
  8. 关于音频PA产生的TDD的debug思路
  9. 好程序员Java学习路线分享finalize()方法详解
  10. FFMpeg-12、自带filter实现混音(系统音和麦克风音混合)