
python之pickle模块
发布日期:2021-05-04 19:07:28
浏览次数:7
分类:技术文章
本文共 2388 字,大约阅读时间需要 7 分钟。
python之pickle模块
文章目录

引入
pickle的使用问题与局限性
Pickle是 Python特有的序列化模块, 它只能用于Python, 并且可能不同版本的Python彼此都不兼容,但是pickle的好处是可以存储Python中的所有的数据类型,包括对象,而json不行
ps : 一般用Pickle保存那些不重要的数据,不能成功地反序列化也没关系
一.序列化与反序列化介绍
点我给你介绍
二.Pickle的使用
1.简单使用
- pickle 将数据存成 Bytes 类型
import pickles = { 1,2,3,4}print(pickle.dumps(s))# b'\x80\x03cbuiltins\nset\nq\x00]q\x01(K\x01K\x02K\x03K\x04e\x85q\x02Rq\x03.'b = b'\x80\x03cbuiltins\nset\nq\x00]q\x01(K\x01K\x02K\x03K\x04e\x85q\x02Rq\x03.'print(pickle.loads(b))# {1, 2, 3, 4}
2.写入文件序列化与反序列化
- 序列化 :
.dumps()
import pickles = {1, 2, 3, 4, 5, }res = pickle.dumps(s)with open('db.pkl', 'wb', )as f: f.write(res)
- 反序列化 :
loads()
with open('db.pkl', 'rb')as f: data = f.read() dic = pickle.loads(data) print(res,type(res)) # {1, 2, 3, 4, 5}
3.简单序列化与反序列化 (提供直接写入文件功能)
- 序列化 :
dump()
import pickles=[1,2,3,4,5]with open('db.pic','wb')as f: pickle.dump(s,f)
- 反序列化 :
load()
with open('db.pic','rb')as f: res = pickle.load(f) print(res,type(res)) # [1, 2, 3, 4, 5]
4.python2与python3的pickle兼容性问题
# coding:utf-8import picklewith open('a.pkl',mode='wb') as f: # 一:在python3中执行的序列化操作如何兼容python2 # python2不支持protocol>2,默认python3中protocol=4 # 所以在python3中dump操作应该指定protocol=2, 为了方便以后兼容python2的协议 pickle.dump('你好啊',f,protocol=2)with open('a.pkl', mode='rb') as f: # 二:python2中反序列化才能正常使用 res=pickle.load(f) print(res)
三.Pickle 与 json 对比
1.json 格式
- 通用格式, 任何语言都支持, 并且都可以解析
- 数据类型有限 : 字典, 列表, 布尔
2.pickle 格式
- 只适用于 Python, 序列化之后拿到的返回值是 Bytes 类型, 其他语言识别不了
- 但可以支持 Python 中的任意类型
3.两种格式序列化与反序列化对比
import jsonimport pickledic = { 'name' : 'shawn'}⛅序列化jjj = json.dumps(dic)ppp = pickle.dumps(dic)print(jjj) # {"name": "shawn"}print(ppp) # b'\x80\x03}q\x00X\x04\x00\x00\x00nameq\x01X\x05\x00\x00\x00shawnq\x02s.'print(type(jjj)) #print(type(ppp) # ⛅反序列化jjj2 = json.loads('{"name": "shawn"}')ppp2 = pickle.loads(b'\x80\x03}q\x00X\x04\x00\x00\x00nameq\x01X\x05\x00\x00\x00shawnq\x02s.')print(jjj2) # {'name': 'shawn'}print(ppp2) # {'name': 'shawn'}print(jjj2["name"],type(jjj2)) # shawn print(ppp2["name"],type(ppp2)) # shawn
4.pickle 可序列化任意类型小示例
import jsonimport pickledic = { 'type' : input}res1 = json.dumps(dic) # 报错 : TypeErrorres2 = pickle.dumps(dic) print(res2) # b'\x80\x03}q\x00X\x04\x00\x00\x00typeq\x01cbuiltins\ninput\nq\x02s.'pickle.loads(res2)["type"]() # 反序列化加括号"()"出来可以直接使用"input"函数
发表评论
最新留言
哈哈,博客排版真的漂亮呢~
[***.90.31.176]2025年04月06日 11时21分51秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
OpenGL hdrb和loom的实例
2019-03-01
OpenGL packetbuffer分组缓冲器的实例
2019-03-01
OpenGL shader class自定义着色器的实例
2019-03-01
Qt Creator编码
2019-03-01
Qt Designer的UI文件格式
2019-03-01
OpenCV透视校正perspective correction的实例(附完整代码)
2019-03-01
48.9%的企业会在人力资源场景中使用电子签约,君子签为HR赋能增效
2019-03-01
Linux部署sendmail邮件服务器
2019-03-01
Centos7部署NFS-V4
2019-03-01
C语言和32位汇编语言关于if-else分支结构的对比分析
2019-03-01
Java小白的入门之路
2019-03-01
Linux自学之旅-基础命令(系统痕迹之who命令)
2019-03-01
css 设置背景图片铺满固定不动
2019-03-01
JAVA_集合
2019-03-01
mvc+webservice+存储过程分页
2019-03-01
mongodb中文档的特殊更新--upsert、remove(根据条件删除数据 )
2019-03-01
微信小程序中的自定义组件
2019-03-01
Eclipse-更改Eclipse中SVN用户名及密码
2019-03-01
Mybatis-PageHelper分页插件-Spring
2019-03-01
MyBatis5_动态SQL
2019-03-01