#序列化模块
**序列化的本质就是将一种数据结构(如字典、列表)等转换成一个特殊的序列(字符串或者bytes)的过程就叫做序列化。**
序列化模块总共只有两种用法,要不就是用于网络传输的中间环节,要不就是文件存储的中间环节
#json模块
- json模块是将满足条件的数据结构转化成特殊的字符串,并且也可以反序列化还原回去。
#dumps、loads
-
用于网络传输,列表字典等于字符串之间的类型转换
-
json.dumps() #序列化 将列表或字典转换成字符串 json.loads() #反序列 将字符串转换返回成原类型
-
列表
lst = [1,"asd",2,"asdcvccc"] print(type(lst),json.dumps(lst),type(json.dumps(lst))) >>><class 'list'> [1, "asd", 2, "asdcvccc"] <class 'str'> ###将列表转换成字符串 print(type(json.dumps(lst)),json.loads(json.dumps(lst)),type(json.loads(json.dumps(lst))) ) >>><class 'str'> [1, 'asd', 2, 'asdcvccc'] <class 'list'> ###将字符串转换成原类型列表
-
带汉字的字符串
a = "asdcchhh123李" print(json.dumps(a)) >>>"asdcchhh123u674e" print(json.dumps(a,ensure_ascii=False)) >>>"asdcchhh123李" #当有汉字时,必须得加ensure_ascii=False
-
字典
lst = {"daye":"李晨浩"} print(json.dumps(lst,ensure_ascii=False),type(json.dumps(lst,ensure_ascii=False))) >>>{"daye": "李晨浩"} <class 'str'> ###将字典转换成字符串 print(json.loads(json.dumps(lst,ensure_ascii=False)),type(json.loads(json.dumps(lst,ensure_ascii=False)))) >>>{'daye': '李晨浩'}{'daye': '李晨浩'} <class 'dict'> ###将字符串转换成原类型字典
#dump 、load
-
用于文件写读,但是对于json序列化,存储多个数据到一个文件中是有问题的,默认一个json文件只能存储一个json数据,但是也可以用dumps、loads解决
-
文件写 json.dumps()
dic1 = {'name':'爸爸'} dic2 = {'age':"1811111111111111111"} with open("josn","a",encoding="utf-8") as f1: f1.write(json.dumps(dic1)+' ') f1.write(json.dumps(dic2)+' ')
-
文件读 json.loads()
with open("josn","r",encoding="utf-8") as f2: for i in f2: print(json.loads(i))
#序列化时间
import json
from json import JSONEncoder
from datetime import datetime
class Com(JSONEncoder):
def default(self, obj):
if isinstance(obj,datetime):
return obj.strftime('%Y-%m-%d %H:%M:%S')
else:
return super(ComplexEncoder,self).default(obj)
d = {'name':'alex','data':datetime.now()}
print(json.dumps(d,cls=Com))
#pickle模块
- pickle模块是将Python所有的数据结构以及对象等转化成bytes类型,然后还可以反序列化还原回去
#dumps、loads
-
用于网络传输
pickle.dumps() #转换成bytes类型 pickle.loads() #由bytes类型转换成原格式
-
dic = {'k1' : 'Lichenhap'} print(pickle.dumps(dic)) >>>b'x80x03}qx00Xx02x00x00x00k1qx01X x00x00x00Lichenhapqx02s.' ###转换成bytes类型 print(pickle.loads(pickle.dumps(dic))) >>>{'k1': 'Lichenhap'} ###由bytes类型转换成原类型字典
#dump、load
-
用于文件写读
pickle.dump 文件写操作 pickle.load 文件读操作
-
pickle.dump 文件写操作 pickle.load 文件读操作 lst = [111,"lichenhao","李晨浩"] with open("txt","ab") as f: pickle.dump(lst,f) ###注意,因为这里转换成字节了,所以文件的操作模式必须是ab with open("txt","rb") as f1: print(pickle.load(f1)) ###将文件内容读取