一、序列化
序列化是指把内存里的数据类型转变成字符串。以使其能存储到硬盘或通过网络传输到远程。——硬盘或网络传输时只能接受bytes。
Python中用于序列化的两个模块:
- json:用于字符串和Python数据类型之间进行转换
- pickle:用于Python特有类型和Python数据类型间进行转换。
json和pickle模块都提供了四个功能:dumps、dump、loads、load
1、序列化
# 把内存数据转成字符,叫做序列化 data = { 'roles':[ {'role':'monster','type':'pig'}, {'role':'hero','type':'关羽'} ] } f = open("game_status","w") # f.write(data) # 写入失败,write只能接收字符串或者是bytes f.write(str(data)) # 内容写入文件中
2、反序列化
# 把字符转成内存数据类型,叫做反序列化 f = open("game_status","r") d = f.read() d = eval(d) print(d['roles'])
二、json模块
把数据类型转成字符串存到内存里的意义:
1、把你的内存数据通过网络共享给远程其他人
2、定义了不同语言之间的交互规则
纯文本:不能共享复杂的数据类型
xml:占空间大
json:相对来说,简单且可读性好。
import json data = { 'roles':[ {'role':'monster','type':'pig'}, {'role':'hero','type':'关羽'} ] } d = json.dumps(data) # 仅转为字符串,可以存入硬盘 print(d,type(d)) """ 输出:{"roles": [{"role": "monster", "type": "pig"}, {"role": "hero", "type": "u5173u7fbd"}]} <class 'str'> """ f = open("test.json","w") # 创建文件对象 d1 = json.dump(data,f) # dump不仅将数据变为字符串还直接写入文件,但是只能存入文件对象中 d2 = json.loads(d) # 仅把字符串转为相应的数据类型 print(d2['roles'],type(d2)) """ 输出:[{'role': 'monster', 'type': 'pig'}, {'role': 'hero', 'type': '关羽'}] <class 'dict'> """ # 从文件中读入: f = open("test.json","r") data = json.load(f) print(data['roles'])
三、pickle模块
import pickle d = {'name':'alex','age':22} l = [1,2,3,4,'rain'] pk = open("data.pkl","wb") # 针对bytes内容必须配置为wb模式 print(pickle.dumps(d)) # b'x80x03}qx00(Xx04x00x.... bytes类型 pickle.dump(d,pk) """ data.pkl文件内容:�}q(XnameqXalexqXageqKu. 文件格式不可直接读。 """ f = open("data.pkl","rb") d = pickle.load(f) print(d) """ 输出:{'name': 'alex', 'age': 22} """ def sayhi(): print('dddddd') pickle.dumps(sayhi) """ 执行不报错,说明pickle可以支持函数序列化 """
四、json&pickle对比
json:
优点:跨语言、体积小
缺点:只能支持intstrlist upledict
pickle:
优点:专为Python设计,支持Python所有的数据类型。
缺点:只能在Python中使用,存储数据占空间大。