将本来的字典、列表或者类的实例对象等内容转换成一个字符串的过程就叫作序列化。python
一、以某种存储形式使对象(例如dict,object)持久化,例如存储到数据库中mysql
二、将对象从一个地方(网络)传递到另外一个地方redis
用于序列化的两个模块:
json,用于字符串 和 python数据类型间进行转换
pickle,用于python特有的类型 和 python的数据类型间进行转换sql
首先明确一点:json本质上就是字符串数据库
json.dumps(python对象)
json.loads(json字符串)
在python中。只有基本的数据类型才能转换成json格式的字符串,也即:int
,float
,str
,list
,tuple
,dict
json
小技巧:如何记忆dumps和loads呢?咱们mysql,redis常用到dumps来持久化,也就是将mysql里的数据以字符串或二进制的形式存储到硬盘,因此对应到json中的dumps,将抽象的数据内容(python对象)转成字符串。
import json pesron = [{'user':'zs','age':10}, {'user': 'ls', 'age':20}] x = 10 y = {'user':'zs','age':10} json_str1 = json.dumps(pesron) json_str2 = json.dumps(x) json_str3 = json.dumps(y) print(type(json_str1),type(x),type(y)) print(json_str1,json_str2,json_str3)
输出网络
<class 'str'> <class 'int'> <class 'dict'> [{"user": "zs", "age": 10}, {"user": "ls", "age": 20}] 10 {"user": "zs", "age": 10}
若是咱们要想把序列化的内容写到文件中,能够直接使用json.dump
spa
import json dic = {1:"a",2:"b"} f = open('myfile','w',encoding='utf-8') json.dump(dic,f) f.close()
使用json.dumps
和json.dump
的时候,只能存放ascii的字符,所以会将中文进行转义,这时候咱们能够作使用ensure_ascii=False
关闭这个特性。code
import json #json_str = "[{'user':'zs','age':10},{'user': 'ls', 'age':20}]" 错误,必须用双引号 json_str1 = """[{"user":"zs","age":10},{"user": "ls", "age":20}]""" json_str2 = """{"user":"zs","age":10}""" json_str3 = """12""" person = json.loads(json_str1) x = json.loads(json_str2) y = json.loads(json_str3) print(type(person),type(x),type(y)) print(person,x,y)
输出对象
<class 'list'> <class 'dict'> <class 'int'> [{'user': 'zs', 'age': 10}, {'user': 'ls', 'age': 20}] {'user': 'zs', 'age': 10} 12
pickle能够序列化任意的数据类型,包括集合和类的对象实例
import pickle class ABC: a = 10 def __init__(self,m,n): self.m = m self.n = n abc = ABC(1,2) res = pickle.dumps(abc) back_res = pickle.loads(res) print(res) print(back_res) print(back_res.a)
输出结果
b'\x80\x03c__main__\nABC\nq\x00)\x81q\x01}q\x02(X\x01\x00\x00\x00mq\x03K\x01X\x01\x00\x00\x00nq\x04K\x02ub.' <__main__.ABC object at 0x10999fba8> 10
注意:将pickle.dumps
的数据写到文件的时候,文件必须使用rb
的模式打开后wb
的模式写入