[TOC]
## 序列化概念
### 什么叫序列化?
序列化是指把内存里的数据类型转变成字符串,以使其能存储到硬盘或通过网络传输到远程,因为硬盘或网络传输时只能接受bytes
### 序列化模块
用于序列化的两个模块
* json:用于字符串 和 python数据类型间进行转换
* pickle:用于python特有的类型和python的数据类型间进行转换
* shelv:简单的k,v类型持久化的模块,可持久化任何pickle支持的python数据格式
Json和pickle模块都提供了四个功能:dumps、dump、loads、load
### 序列化和反序列化
* dumps 和 dump序列化方法:
dumps只完成了序列化为str;
dump必须传文件描述符,将序列化的str保存到文件中
* loads和load反序列化方法:
loads 只完成了反序列化;
load 只接收文件描述符,完成了读取文件和反序列化
### json、pickle对比:
* **JSON:**
优点:跨语言、体积小
缺点:只能支持int、str、list、tuple、dict
* **Pickle:**
优点:专为python设计,支持python所有的数据类型
缺点:只能在python中使用,存储数据占空间大
## 序列化操作举例
### pickle模块举例
```
import pickle
data = {'k1':123,'k2':'Hello'}
# pickle.dumps 将数据通过特殊的形式转换为只有python语言认识的字符串
p_str = pickle.dumps(data)
print('直接打印:',p_str)
#pickle.dump 将数据通过特殊的形式转换位只有python语言认识的字符串,并写入文件
with open('t.txt','wb+') as fp:
pickle.dump(data,fp)
fp.seek(0)
print('存后打印:',fp.read())
#输出结果
直接打印: b'\x80\x03}q\x00(X\x02\x00\x00\x00k1q\x01K{X\x02\x00\x00\x00k2q\x02X\x05\x00\x00\x00Helloq\x03u.'
存后打印: b'\x80\x03}q\x00(X\x02\x00\x00\x00k1q\x01K{X\x02\x00\x00\x00k2q\x02X\x05\x00\x00\x00Helloq\x03u.'
```
### json模块举例
```
import json
data = {'k1':123,'k2':'Hello'}
# json.dumps 将数据通过特殊的形式转换位所有程序语言都认识的字符串
j_str = json.dumps(data)
print('直接打印:',j_str)
#json.dump 将数据通用的json格式字符串,并写入文件
with open('t.txt','w+',encoding='utf-8') as fp:
json.dump(data,fp)
fp.seek(0)
print('存后打印:',fp.read())
#输出结果
直接打印: {"k1": 123, "k2": "Hello"}
存后打印: {"k1": 123, "k2": "Hello"}
```
## shelve模块举例
前两个模块都可以序列化为字符串后序列化存储到文件中并反序列化出来,但shelve模块只能序列化到文件和反序列化出来,不能直接序列化为字符串
### shelve序列化:
```
import shelve
names = ["alex", "rain", "test"]
info = {'name':'alex','age':22}
f = shelve.open('tt.txt') # 打开一个文件
f["names"] = names # 持久化列表
f['info_dic'] = info
f.close()
```
### shelve反序列化:
```
import shelve
d = shelve.open('tt.txt') # 打开一个文件
print('name:',d['names'])
print('info:',d['info_dic'])
del d['test'] #还可以删除
# 输出结果
name: ['alex', 'rain', 'test']
info: {'name': 'alex', 'age': 22}
```
* 其他
用shelve打开文件后,还可以删除序列化后的某些内容。
`del d['info_dic']`
- 基础部分
- 基础知识
- 变量
- 数据类型
- 数字与布尔详解
- 列表详解list
- 字符串详解str
- 元组详解tup
- 字典详解dict
- 集合详解set
- 运算符
- 流程控制与循环
- 字符编码
- 编的小程序
- 三级菜单
- 斐波那契数列
- 汉诺塔
- 文件操作
- 函数相关
- 函数基础知识
- 函数进阶知识
- lambda与map-filter-reduce
- 装饰器知识
- 生成器和迭代器
- 琢磨的小技巧
- 通过operator函数将字符串转换回运算符
- 目录规范
- 异常处理
- 常用模块
- 模块和包相关概念
- 绝对导入&相对导入
- pip使用第三方源
- time&datetime模块
- random随机数模块
- os 系统交互模块
- sys系统模块
- shutil复制&打包模块
- json&pickle&shelve模块
- xml序列化模块
- configparser配置模块
- hashlib哈希模块
- subprocess命令模块
- 日志logging模块基础
- 日志logging模块进阶
- 日志重复输出问题
- re正则表达式模块
- struct字节处理模块
- abc抽象类与多态模块
- requests与urllib网络访问模块
- 参数控制模块1-optparse-过时
- 参数控制模块2-argparse
- pymysql数据库模块
- requests网络请求模块
- 面向对象
- 面向对象相关概念
- 类与对象基础操作
- 继承-派生和组合
- 抽象类与接口
- 多态与鸭子类型
- 封装-隐藏与扩展性
- 绑定方法与非绑定方法
- 反射-字符串映射属性
- 类相关内置方法
- 元类自定义及单例模式
- 面向对象的软件开发
- 网络-并发编程
- 网络编程SOCKET
- socket简介和入门
- socket代码实例
- 粘包及粘包解决办法
- 基于UDP协议的socket
- 文件传输程序实战
- socketserver并发模块
- 多进程multiprocessing模块
- 进程理论知识
- 多进程与守护进程
- 锁-信号量-事件
- 队列与生产消费模型
- 进程池Pool
- 多线程threading模块
- 进程理论和GIL锁
- 死锁与递归锁
- 多线程与守护线程
- 定时器-条件-队列
- 线程池与进程池(新方法)
- 协程与IO模型
- 协程理论知识
- gevent与greenlet模块
- 5种网络IO模型
- 非阻塞与多路复用IO实现
- 带着目标学python
- Pycharm基本使用
- 爬虫
- 案例-爬mzitu美女
- 案例-爬小说
- beautifulsoup解析模块
- etree中的xpath解析模块
- 反爬对抗-普通验证码
- 反爬对抗-session登录
- 反爬对抗-代理池
- 爬虫技巧-线程池
- 爬虫对抗-图片懒加载
- selenium浏览器模拟