zl程序教程

您现在的位置是:首页 >  后端

当前栏目

Python的数据序列化「Json & Pickle」

Pythonamp数据JSONJSON 序列化 pickle
2023-09-27 14:21:43 时间


在介绍Python的数据序列化模块「Json Pickle」之前,我们先来看看为什么需要数据序列化,什么是数据序列化。

为什么需要数据序列化,我认为有如下两种原因:

一个原因是将对象(一切皆对象)的状态保持在存储媒介(硬盘、网盘......)中,以便可以在以后重新创建精确的副本,相当于镜像的概念,比如我们平时利用VMware虚拟机中的挂起功能,这个挂起功能就是利用数据的序列化,把虚拟机当前的状态序列化保存在本地磁盘的文件中,然后恢复的时候只需反序列化,把状态恢复即可。

另一个原因是通过值将对象从一个应用程序域发送到另一个应用程序域中。例如,你利用Python监控采集程序采集到的数据想传送给Zabbix处理。当两个进程在进行远程通信时,彼此可以发送各种类型的数据。无论是何种类型的数据,都会以二进制序列的形式在网络上传送。发送方需要把这个对象转换为字节序列,才能在网络上传送;接收方则需要把字节序列再恢复为对象。

序列化和反序列化:

序列化: 将数据结构或对象转换成二进制串的过程。 反序列化:将在序列化过程中所生成的二进制串转换成数据结构或者对象的过程。

序列化的目的就是为了跨进程传递格式化数据和保存某个时刻的状态。

什么是数据序列化:

数据序列化就是将对象或者数据结构转化成特定的格式,使其可在网络中传输,或者可存储在内存或者文件中。反序列化则是相反的操作,将对象从序列化数据中还原出来。而对象序列化后的数据格式可以是二进制,可以是XML,也可以是JSON等任何格式。对象/数据序列化的重点在于数据的交换和传输,例如在远程调用技术(如EJB,XML-RPC, Web Service),或者在GUI控件开发(JavaBean)等等。

清楚了数据格式化的必要和简单认识了什么是数据格式化之后,我们就来看看Python中两个数据格式化模块的使用。

Json Module

Json:用于字符串和 python数据类型间进行转换;

Json模块提供了四个功能:dumps、dump、loads、load

1.dumps把数据类型转换成字符串

2.dump把数据类型转换成字符串并存储在文件中

3.loads把字符串转换成数据类型

4.load把文件打开从字符串转换成数据类型

实例如下:


#!/usr/bin/env python3  # _*_coding:utf-8_*_  # Author: Lucky.chen  import json  info = {1MinLoad: 5, MemUse: 5G, DiskUse: 80G}  print(dumps 操作之前数据类型: %s % type(info))  JsonInfo = json.dumps(info)  print(JsonInfo)  # dumps 将数据通过特殊的形式转换为所有程序语言都识别的字符串  print(dumps 操作之后数据类型: %s % type(JsonInfo))  # loads 将字符串通过特殊的形式转为python是数据类型  (将字符串转为字典)  NewInfo = json.loads(JsonInfo)  print(loads 操作之后数据类型为: %s % type(NewInfo))  print(分割线.center(50, -))  # dump 将数据通过特殊的形式转换为所有语言都识别的字符串并写入文件  with open(SystemInfo.txt, w) as f:      json.dump(info, f)      print(dump file end!!)  # load 从文件读取字符串并转换为python的数据类型  with open(SystemInfo.txt, r) as f:      LoadInfo = json.load(f)      print(load file end, data type is %s % type(LoadInfo), LoadInfo) 

结果如下:


dumps 操作之前数据类型:  class dict   {"MemUse": "5G", "DiskUse": "80G", "1MinLoad": 5}  dumps 操作之后数据类型:  class str   loads 操作之后数据类型为:  class dict   -----------------------分割线------------------------  dump file end!!  load file end, data type is  class dict  {MemUse: 5G, 1MinLoad: 5, DiskUse 

一个错误案例如下:


#!/usr/bin/env python3  # _*_coding:utf-8_*_  # Author: Lucky.chen  import json  def test():      print(Test Func)  info = {Name: crh, age: 18, Func: test}  json.dumps(info) 

结果:


raise TypeError(repr(o) + " is not JSON serializable")  ypeError:  function test at 0x108e7a0d0  is not JSON serializable 

如上可知函数不能被json序列化。

Pickle Module

pickle,用于python特有的类型 和 python的数据类型间进行转换

Pickle模块同样提供了四个功能:dumps、dump、loads、load

1.dumps把数据类型转换成字符串

2.dump把数据类型转换成字符串并存储在文件中

3.oads把字符串转换成数据类型

4.load把文件打开从字符串转换成数据类型

Pickle可以序列化一些较复杂的数据,和json的区别在于pickle序列化的时候,存放的是二进制的文件,所以打开一个文件的时候,我们要以二进制的格式打开。

实例如下:


#!/usr/bin/env python3  # _*_coding:utf-8_*_  # Author: Lucky.chen  import pickle  def test(name):      print(%s write Test Func % name)  info = {Name: crh, age: 18, Func: test}  print(dumps 之前数据的类型为: %s % type(info))  # pickle.dumps 将数据通过特殊的形式转换为只有python语言认识bytes类型(Python2.*中是字符串类型)  NewInfo = pickle.dumps(info)  print(dumps result is %s, data type is %s % (NewInfo, type(NewInfo)))  # pickle.loads 将bytes通过特殊的形式转为python是数据类型  LoadInfo = pickle.loads(NewInfo)  print(loads result is %s, data type is %s % (LoadInfo, type(LoadInfo)))  LoadInfo[Func](crh)  print(分割线.center(50, -))  # pickle.dump 将数据通过特殊的形式转换为只有python语言认识的字符串,并写入文件  with open(pickle.rb, wb) as f:      pickle.dump(info, f)  # pickle.load 从文件读取只有python语言认识的字符串并转换为python的数据类型  with open(pickle.rb, rb) as f:      Info = pickle.load(f)  print(Info, type is %s % type(Info)) 

结果如下:


dumps 之前数据的类型为:  class dict   dumps result is b\x80\x03}q\x00(X\x03\x00\x00\x00ageq\x01K\x12X\x04\x00\x00\x00Nameq\x02X\x03\x00\x00\x00crhq\x03X\x04\x00\x00\x00Funcq\x04c__main__\ntest\nq\x05u., data type is  class bytes   loads result is {age: 18, Name: crh, Func:  function test at 0x1032f10d0 }, data type is  class dict   crh write Test Func  -----------------------分割线------------------------  {age: 18, Name: crh, Func:  function test at 0x1032f10d0 } type is  class di 

总结

很多情况下不同的程序之间传送数据我们一般通过文件的方式,但是这个方法是最原始的,而dumps可以直接让数据格式化传送给对方,但是不是所有的程序都是python的,所以只利用pickle是不现实的,比如一个python的程序需要发送一段数据给一个java程序开发的应用,这时候很多内存数据的交换,就得用json了。

并且josn能dump的结果更可读,那么有人就问了,那还用pickle做什么不直接用josn,是这样的josn只能把常用的数据类型序列化(列表、字典、列表、字符串、数字、),比如日期格式、类对象!josn就不行了。


为什么他不能序列化上面的东西呢?因为josn是跨语言的!注定了它只能规范出一些通用的数据类型的格式,统一标准。


作者:采菊篱下

来源:51CTO


Python 文件存储:pickle 和 json 库的使用 在 Python 中, 可以通过第三方库 json 方便地实现 JSON 格式字符串与 Python 字典和列表的相互转换。JSON(javascript object notation)是一种和语言无关的轻量级数据交换格式, 采用文本格式来存储和表示数据。模块能够将 Python 对象直接存储到文件中。在需要使用数据时,直接从文件中读取,并还原为 Python 对象。因此, 存储的文件如果直接使用文本编辑器,则打开无法查看具体内容。在 Python 中, 提供的。相反,将上面代码中的。
python-时间模块,random、os、sys、shutil、json和pickle模块 一、time与datetime模块 time模块: 时间戳:表示的是从1970年1月1日00:00:00开始按秒计算的偏移量,返回类型为float类型 格式化时间字符串(Format String) 结构化的时间(struct_time):struct_time元组共有9个元素(年月日时分秒,一年中的第几周,一年中的第几天,夏令时)