当前位置: 首页 > news >正文

python之pickle模块

python之pickle模块

文章目录

  • python之pickle模块
    • 引入
        • pickle的使用问题与局限性
    • 一.序列化与反序列化介绍
    • 二.Pickle的使用
      • 1.简单使用
      • 2.写入文件序列化与反序列化
      • 3.简单序列化与反序列化 (提供直接写入文件功能)
        • 4.python2与python3的pickle兼容性问题
    • 三.Pickle 与 json 对比
      • 1.json 格式
      • 2.pickle 格式
      • 3.两种格式序列化与反序列化对比
      • 4.pickle 可序列化任意类型小示例

img

引入

pickle的使用问题与局限性

Pickle是 Python特有的序列化模块, 它只能用于Python, 并且可能不同版本的Python彼此都不兼容,但是pickle的好处是可以存储Python中的所有的数据类型,包括对象,而json不行

ps : 一般用Pickle保存那些不重要的数据,不能成功地反序列化也没关系

一.序列化与反序列化介绍

👉Pickle是Python的内置模块👈点我给你介绍

二.Pickle的使用

1.简单使用

  • pickle 将数据存成 Bytes 类型
import pickle

s = {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 pickle

s = {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} <class 'set'>

3.简单序列化与反序列化 (提供直接写入文件功能)

  • 序列化 : dump()
import pickle

s=[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] <class 'list'>

4.python2与python3的pickle兼容性问题

# coding:utf-8
import pickle

with 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 json
import pickle

dic = {'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))  # <class 'str'>
print(type(ppp)   # <class 'bytes'>
      
⛅反序列化
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 <class 'dict'>
print(ppp2["name"],type(ppp2))  # shawn <class 'dict'>

4.pickle 可序列化任意类型小示例

import json
import pickle

dic = {'type' : input}
res1 = json.dumps(dic)   # 报错 : TypeError
res2 = pickle.dumps(dic) 
print(res2)  # b'\x80\x03}q\x00X\x04\x00\x00\x00typeq\x01cbuiltins\ninput\nq\x02s.'

pickle.loads(res2)["type"]()  # 反序列化加括号"()"出来可以直接使用"input"函数

相关文章:

  • python之time与datetime模块
  • python之random模块
  • python之os模块
  • shutil模块
  • shelve 模块
  • typing模块
  • 压缩zipfile与解压缩tarfile模块
  • pyecharts 模块的简单使用
  • hashlib 与 hmac 模块
  • python之包
  • python之logging模块详解
  • logging模块基本介绍及使用
  • 面向对象的由来
  • python之面向对象编程
  • 类的封装
  • 《Java8实战》-第四章读书笔记(引入流Stream)
  • 【面试系列】之二:关于js原型
  • 2017-09-12 前端日报
  • CSS居中完全指南——构建CSS居中决策树
  • ECMAScript6(0):ES6简明参考手册
  • E-HPC支持多队列管理和自动伸缩
  • JavaScript中的对象个人分享
  • Java编程基础24——递归练习
  • Mithril.js 入门介绍
  • Sass Day-01
  • Sequelize 中文文档 v4 - Getting started - 入门
  • Wamp集成环境 添加PHP的新版本
  • 短视频宝贝=慢?阿里巴巴工程师这样秒开短视频
  • 关于springcloud Gateway中的限流
  • 看图轻松理解数据结构与算法系列(基于数组的栈)
  • 前端自动化解决方案
  • 责任链模式的两种实现
  • zabbix3.2监控linux磁盘IO
  • 如何在招聘中考核.NET架构师
  • #、%和$符号在OGNL表达式中经常出现
  • #etcd#安装时出错
  • #调用传感器数据_Flink使用函数之监控传感器温度上升提醒
  • (2)关于RabbitMq 的 Topic Exchange 主题交换机
  • (C语言)共用体union的用法举例
  • (定时器/计数器)中断系统(详解与使用)
  • (九)信息融合方式简介
  • (四)docker:为mysql和java jar运行环境创建同一网络,容器互联
  • (四)搭建容器云管理平台笔记—安装ETCD(不使用证书)
  • (万字长文)Spring的核心知识尽揽其中
  • (一)python发送HTTP 请求的两种方式(get和post )
  • (转)shell中括号的特殊用法 linux if多条件判断
  • .bat批处理(一):@echo off
  • .equal()和==的区别 怎样判断字符串为空问题: Illegal invoke-super to void nio.file.AccessDeniedException
  • .NET CF命令行调试器MDbg入门(三) 进程控制
  • .NET Framework 3.5中序列化成JSON数据及JSON数据的反序列化,以及jQuery的调用JSON
  • .net Signalr 使用笔记
  • .net操作Excel出错解决
  • .net企业级架构实战之7——Spring.net整合Asp.net mvc
  • .NET企业级应用架构设计系列之技术选型
  • .NET上SQLite的连接