首页 > 技术文章 > 模块(二)序列化

sundawei7 2019-07-26 20:16 原文

序列化模块

序列化的本质就是将一种数据结构(如字典、列表)等转换成一个特殊的序列(字符串或者bytes)的过程就叫做序列化。

dic = {'name': 'aaa'}
ret = str(dic)         
print(ret,type(ret))

首先是一个特殊的序列,而不是常用的str这种字符串。

比如,程序中需要一个字典类型的数据存放你的个人信息:

 dic = {'username':'aaa', 'password': 123,'login_status': True}

  程序中有一些地方都需要使用这个dic数据,登录时会用到,注册时也会用到。那么我们就是将这个dic写在全局里,但是这样是不合理的,应该是将这数据写入一个地方存储(还没有学数据库)先存放在一个文件中,那么程序中哪里需要这个数据了,就读取文件取出需要的信息即可。

json序列化,pickle序列化有所不同。

json序列化除了可以解决写入文件的问题,还可以解决网络传输的问题,比如将一个list数据结构通过网络传给另个开发者,那么不可以直接传输,想传输出去必须用bytes类型。但是bytes类型只能与字符串类型互相转化,它不能与其他数据结构直接转化,所以,只能将list ---> 字符串 ---> bytes 然后发送,对方收到之后,在decode() 解码成原字符串。此时这个字符串不能是str那种字符串,因为它不能反解,必须要是这个特殊的字符串,他可以反解成list 这样开发者之间就可以借助网络互传数据了,不仅仅是开发者之间,要借助网络爬取数据这些数据多半是这种特殊的字符串,接受到之后,在反解成需要的数据类型。

序列化模块就是将一个常见的数据结构转化成一个特殊的序列,并且这个特殊的序列还可以反解回去。它的主要用途:文件读写数据,网络传输数据。

Python中这种序列化模块有三种:

json模块 :

  1. 不同语言都遵循的一种数据转化格式,即不同语言都使用的特殊字符串。(比如Python的一个列表[1, 2, 3]利用json转化成特殊的字符串,然后在编码成bytes发送给php的开发者,php的开发者就可以解码成特殊的字符串,然后在反解成原数组(列表): [1, 2, 3])
  2. json序列化只支持部分Python数据结构:dict,list, tuple,str,int, float,True,False,None

pickle模块:

  1. 只能是Python语言遵循的一种数据转化格式,只能在python语言中使用。
  2. 支持Python所有的数据类型包括实例化对象。

shelve模块:类似于字典的操作方式去操作特殊的字符串。

1.1 json模块

json模块是将满足条件的数据结构转化成特殊的字符串,并且也可以反序列化还原回去。

json模块总共就有两对四个方法:

用于网络传输:dumps、loads

用于文件写读:dump、load

dumps、loads

  1. 将字典类型转换成字符串类型
import json
dic = {'k1':'v1','k2':'v2','k3':'v3'}
str_dic = json.dumps(dic)  #序列化:将一个字典转换成一个字符串
print(type(str_dic),str_dic)  #<class 'str'> {"k3": "v3", "k1": "v1", "k2": "v2"}
#注意,json转换完的字符串类型的字典中的字符串是由""表示的
  1. 将字符串类型的字典转换成字典类型
import json
dic2 = json.loads(str_dic)  #反序列化:将一个字符串格式的字典转换成一个字典
#注意,要用json的loads功能处理的字符串类型的字典中的字符串必须由""表示
print(type(dic2),dic2)  #<class 'dict'> {'k1': 'v1', 'k2': 'v2', 'k3': 'v3'}
  1. 还支持列表类型
list_dic = [1,['a','b','c'],3,{'k1':'v1','k2':'v2'}]
str_dic = json.dumps(list_dic) #也可以处理嵌套的数据类型 
print(type(str_dic),str_dic) #<class 'str'> [1, ["a", "b", "c"], 3, {"k1": "v1", "k2": "v2"}]
list_dic2 = json.loads(str_dic)
print(type(list_dic2),list_dic2) #<class 'list'> [1, ['a', 'b', 'c'], 3, {'k1': 'v1', 'k2': 'v2'}]

dump、load

  1. 将对象转换成字符串写入到文件当中
import json
f = open('json_file.json','w')
dic = {'k1':'v1','k2':'v2','k3':'v3'}
json.dump(dic,f)  #dump方法接收一个文件句柄,直接将字典转换成json字符串写入文件
f.close()
# json文件也是文件,就是专门存储json字符串的文件。
  1. 将文件中的字符串类型的字典转换成字典
import json
f = open('json_file.json')
dic2 = json.load(f)  #load方法接收一个文件句柄,直接将文件中的json字符串转换成数据结构返回
f.close()
print(type(dic2),dic2)

其他参数说明

ensure_ascii:,当它为True的时候,所有非ASCII码字符显示为\uXXXX序列,只需在dump时将ensure_ascii设置为False即可,此时存入json的中文即可正常显示。

separators:分隔符,实际上是(item_separator, dict_separator)的一个元组,默认的就是(,

推荐阅读