python 序列化与反序列化,python序列化和反序列化作用

  python 序列化与反序列化,python序列化和反序列化作用

  为了简化数据类型的写入和获取,今天我们将学习一个新的知识点——序列化。通过学习序列化,你不用太担心什么数据类型被写入文件,读取文件也可以非常容易地恢复数据类型。有兴趣的可以了解一下。

  00-1010熟悉序列化和反序列化什么是序列化?Python中的可序列化数据类型jsondumps()和loads()函数演示了可序列化数据类型bool、None类型的序列化和反序列化的案例pickledumps()和loads()在Python中pickle模块的序列化和反序列化练习json模块-序列化练习。在前几章中,我们学习了文件对象的创建、写入和读取,并针对。py文件和。txt文件。从前面的学习中我们知道,文件对象的读写只能通过字符串或字节类型来操作,其他类型只能通过格式化存储或数据类型转换来实现。

  但是,无论哪种方式,从文件中读取数据后,都需要进行复杂的处理才能恢复到原来的数据类型。为了简化数据类型的写入和获取,今天我们将学习一个新的知识点——序列化。

  通过学习序列化,你不用太担心什么数据类型被写入文件,读取文件也可以非常容易地恢复数据类型。【我很讨厌这种每章之前写个概述和总结的短句。]

  

目录

  

初识序列化与反序列化

  一般来说,序列化就是通过一定的规则将对象或数据结构的信息进行转换,可以达到文件存储或网络传输的效果。通过前面几章的学习,我们知道如果要存储或者通过网络传输,最终的数据类型都是字符串,而这些字符串需要是有一定规则的字符串。

  而我们今天要学习的内置模块——JSON可以用于文件存储或者网络传输,这也是序列化的功能。

  反序列化是由序列化规则生成的字符串,然后反转为原来的数据类型,这就是反序列化。

  在这里,我们可以介绍字符串和字节之间的转换,以了解序列化和反序列化。字符串和字节类型转换常用的encode()函数和decode()函数分别代表编码和解码,所以有编码就一定有解码。序列化方面,既然有序列化,就要有相应的反序列化。

  

什么是序列化?

  哪些数据类型是可序列化的,哪些不是?

  Serializable: number,str,list,tuple,dict [dictionary是最常用的序列化数据类型]

  不可序列化:类、定义(函数和实例化对象)和集不能序列化。

  

可序列化的数据类型

  Json模块是一个通用的序列化模块,通过它可以完成通用的序列化和反序列化操作。为什么是通用的?是因为几乎所有的编程语言都有json模块,它们的序列化和反序列化规则是统一的。

  所以我们在Python中序列化的东西可以在其他任何编程语言中反序列化,使用原始数据,这意味着通用。

  

Python 中的json

  json中最重要的函数是dumps()和loads()函数。

  method参数引入了一个返回值dumpsobj对象序列化json.dumps([1,2,3])字符串loadsstr反序列化Json.loads([1,2,3])原始数据类型的示例。

  

dumps() 与 loads() 函数

  示范案例如下:

  pre class="brush:py;">import json

  int_test = 666 # 定义 整型、字符串、列表、元组、字典 五种数据类型 ,用于序列化测试

  str_test = test_string

  list_test = [1, 2, 3]

  tuple_test = (4, 5, 6)

  dict_test = {Name: 托尼.史塔克, Sex: 男}

  int_test_json = json.dumps(int_test) # 将上文中五种数据类型进行序列化操作

  str_test_json = json.dumps(str_test)

  list_test_json = json.dumps(list_test)

  tuple_test_json = json.dumps(tuple_test)

  dict_test_json = json.dumps(dict_test)

  

  在 Treminal 终端 执行上述测试脚本,如下图:

  

  这里我们重点介绍一下 字典类型的序列化结果

  

In [7]: dict_test_json

  Out[7]: {"Name": "\\u6258\\u5c3c.\\u53f2\\u5854\\u514b", "Sex": "\\u7537"}

  

  从执行结果我们可以看出字典类型的数据类型,经过序列化后。字典变成了字符串的同时,且字典内的 单引号 变成了 双引号,中文也变成了比特类型,并且进行了 encode 。(这是序列化的一个标准)

  为什么我们说 字典类型是非常是和序列化的呢?实际上 json 并不仅仅是一个标准,也是一种文件格式。比如我们编写脚本的 .py 格式的文件,就是 python 文件容器;.txt 格式的文件是普通的文本文件容器;同样的,.json 格式的文件也是文件容器,json 文件存储的样式(格式)就是字典类型的序列化格式。

  接下来我们再尝试将上文的五种测试数类型反序列化处理,看看结果会怎样?

  

_int_test_json = json.loads(int_test_json)

  _str_test_json = json.loads(str_test_json)

  _list_test_json = json.loads(list_test_json)

  _tuple_test_json = json.loads(tuple_test_json)

  _dict_test_json = json.loads(dict_test_json)

  

  在 Treminal 终端 执行上述测试脚本,如下图:

  

  划重点:元组类型经过序列化处理后再通过反序列化还原数据时,会变为列表数据类型。这是因为 元组类型 是 python 语言中特有的数据类型,json 作为一个通用格式,无法识别元组类型。所以在针对元组类型进行序列化的时候,会先将 元组类型 ,先转为 列表,再进行序列化处理;同样的在进行反序列化处理时,就会将序列化后的 元组类型 ,又转成了 列表类型 。(类型的转换,不影响对数据的使用)

  

  

bool 、None 类型的序列化与反序列化

  示例如下:

  

print(json.dumps(True))

  # >>> 输出结果:true

  print(json.dumps(False))

  # >>> 输出结果:false

  print(json.dumps(None))

  # >>> 输出结果:null

  

  从上述运行结果来看,bool 类型经过序列化处理后,变成了小写的 true、false;而 None 类型则变成了 小写的 null 。

  之所以会这样,是因为在大多数的编程语言中, bool 类型都是小写的 true、false 。json 作为一个通用的序列化模块,也同样遵循着这种规则。(小写的 true、false 依然是字符串类型。 )

  接下来我们再将上述的序列化处理后的 bool 、None 类型 进行反序列化处理

  

print(json.loads(json.dumps(None)))

  # >>> 输出结果:None

  print(json.loads(json.dumps(True)))

  # >>> 输出结果:True

  print(json.loads(json.dumps(False)))

  # >>> 输出结果:False

  

  从执行结果我们看到,经过反序列化之后,bool、None 类型又被还原成了 python 可读的状态。

  

  

  

Python 中的pickle

  pickle模块与json模块一样可以进行序列化与反序列化,区别在于 pickle 是 Python 内置的序列化模块,而且不像 json 那么通用,它只能用于 python 自身来使用,其他语言可能就无法处理了,但pickle模块的性能是要比 json 更好的。如果是仅仅用于 python 自身来使用,pckle 模块还是一个挺不错的选择哦。

  

dumps() 与 loads() 函数

  方法名参数介绍举例返回值dumpsobj对象序列化json.dumps([1, 2, 3])比特loadsstr反序列化Json.loads(’[1, 2, 3]’)原始数据类型

  注意:区别于 json ,pickle 模块的 dumps() 函数 返回的是 byte 类型 ,而 loads() 函数也仅支持 byte 类型的 pickle 序列进行反序列化的操作。

  

  

pickle模块的序列化与反序列化练习

  pickle模块与json模块的用法是完全一致的,这里我们就不过多的演示,只针对 dict 类型演示一下即可。

  

  

  

json 模块 - 序列化小实战

  需求:

  创建一个 test.json 的空文件。

  定义一个 write 函数写入 dict 数据类型的内容到 test.json 文件

  定义一个 read 函数,将写入到 test.json 文件的内容,反序列化读取出来

  

# coding:utf-8

  import json

  data = {name: 托尼·史塔克, age: 52, top: 185}

  def read(path): # 定义 read() 函数,读取 test.json 文件(返回对象为 反序列化后的内容)

   with open(path, r) as f:

   data = f.read()

   return json.loads(data)

  def write(path, data): # 定义 write() 函数,将 data 写入到 test.json 文件

   with open(path, w) as f:

   if isinstance(data, dict): # 判断 data 是否为字典类型。不是的情况下主动抛出异常

   _data = json.dumps(data)

   f.write(_data)

   else:

   raise TypeError(\data\ 不是一个字典类型的数据)

   return True

  if __name__ == __main__:

   write(test.json, data)

   result = read(test.json)

   print(result)

   result[Sex] = Man # 加入 {Sex: Max} 键值对

   write(test.json, result) # 将加入的 键值对 写入 test.json 文件

   result_test_json = read(test.json)

   print(result_test_json)

  

  执行结果如下:

  

  

  总结:json的使用在我们的未来 工作中是非常高频的,所以大家一定要多多练习,加以掌握。

  到此这篇关于Python文件的应用之序列化与反序列化详解的文章就介绍到这了,更多相关Python文件序列化内容请搜索盛行IT软件开发工作室以前的文章或继续浏览下面的相关文章希望大家以后多多支持盛行IT软件开发工作室!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: