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

在介绍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把文件打开从字符串转换成数据类型

实例如下:


  1. #!/usr/bin/env python3 
  2. # _*_coding:utf-8_*_ 
  3. # Author: Lucky.chen 
  4.  
  5. import json 
  6.  
  7. info = {'1MinLoad': 5, 'MemUse': '5G', 'DiskUse': '80G'} 
  8.  
  9. print('dumps 操作之前数据类型: %s' % type(info)) 
  10. JsonInfo = json.dumps(info) 
  11. print(JsonInfo) 
  12. # dumps 将数据通过特殊的形式转换为所有程序语言都识别的字符串 
  13. print('dumps 操作之后数据类型: %s' % type(JsonInfo)) 
  14.  
  15. # loads 将字符串通过特殊的形式转为python是数据类型  (将字符串转为字典) 
  16. NewInfo = json.loads(JsonInfo) 
  17. print('loads 操作之后数据类型为: %s' % type(NewInfo)) 
  18.  
  19. print('分割线'.center(50, '-')) 
  20.  
  21. # dump 将数据通过特殊的形式转换为所有语言都识别的字符串并写入文件 
  22. with open('SystemInfo.txt', 'w') as f: 
  23.     json.dump(info, f) 
  24.     print('dump file end!!') 
  25.  
  26. # load 从文件读取字符串并转换为python的数据类型 
  27. with open('SystemInfo.txt', 'r') as f: 
  28.     LoadInfo = json.load(f) 
  29.     print('load file end, data type is %s' % type(LoadInfo), LoadInfo) 

结果如下:


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

一个错误案例如下:


  1. #!/usr/bin/env python3 
  2. # _*_coding:utf-8_*_ 
  3. # Author: Lucky.chen 
  4.  
  5. import json 
  6.  
  7.  
  8. def test(): 
  9.     print('Test Func') 
  10.  
  11. info = {'Name': 'crh', 'age': 18, 'Func': test} 
  12.  
  13. json.dumps(info) 

结果:


  1. raise TypeError(repr(o) + " is not JSON serializable") 
  2. 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序列化的时候,存放的是二进制的文件,所以打开一个文件的时候,我们要以二进制的格式打开。

实例如下:


  1. #!/usr/bin/env python3 
  2. # _*_coding:utf-8_*_ 
  3. # Author: Lucky.chen 
  4.  
  5. import pickle 
  6.  
  7.  
  8. def test(name): 
  9.     print('%s write Test Func' % name) 
  10.  
  11. info = {'Name': 'crh', 'age': 18, 'Func': test} 
  12.  
  13. print('dumps 之前数据的类型为: %s' % type(info)) 
  14.  
  15. # pickle.dumps 将数据通过特殊的形式转换为只有python语言认识bytes类型(Python2.*中是字符串类型) 
  16. NewInfo = pickle.dumps(info) 
  17. print('dumps result is %s, data type is %s' % (NewInfo, type(NewInfo))) 
  18.  
  19. # pickle.loads 将bytes通过特殊的形式转为python是数据类型 
  20. LoadInfo = pickle.loads(NewInfo) 
  21. print('loads result is %s, data type is %s' % (LoadInfo, type(LoadInfo))) 
  22. LoadInfo['Func']('crh') 
  23.  
  24. print('分割线'.center(50, '-')) 
  25.  
  26. # pickle.dump 将数据通过特殊的形式转换为只有python语言认识的字符串,并写入文件 
  27. with open('pickle.rb', 'wb') as f: 
  28.     pickle.dump(info, f) 
  29.  
  30. # pickle.load 从文件读取只有python语言认识的字符串并转换为python的数据类型 
  31. with open('pickle.rb', 'rb') as f: 
  32.     Info = pickle.load(f) 
  33.  
  34. print(Info, 'type is %s' % type(Info)) 

结果如下:


  1. dumps 之前数据的类型为: <class 'dict'> 
  2. 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'> 
  3. loads result is {'age': 18, 'Name': 'crh', 'Func': <function test at 0x1032f10d0>}, data type is <class 'dict'> 
  4. crh write Test Func 
  5. -----------------------分割线------------------------ 
  6. {'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

时间: 2024-08-31 11:51:05

Python的数据序列化「Json & Pickle」的相关文章

Redis 数据序列化方法 serialize, msgpack, json, hprose 比较

最近弄 Redis ,涉及数据序列化存储的问题,对比了:JSON, Serialize, Msgpack, Hprose 四种方式 1. 对序列化后的字符串长度对比: 测试代码: $arr = [0, 1, 2, 'a', 'b', 'c', 'd', 'a'=>'12', '包含中文', 'abcd包含中文efg'=>'abc一二三四defg', '键名'=>['abc'=>['def'=>123, 456, 'abcd中文内容efg'], 'a之间c'=>['a'=

python 把数据 json格式输出的实例代码_python

有个要求需要在python的标准输出时候显示json格式数据,如果缩进显示查看数据效果会很好,这里使用json的包会有很多操作 import json date = {u'versions': [{u'status': u'CURRENT', u'id': u'v2.3', u'links': [{u'href': u'http://controller:9292/v2/', u'rel': u'self'}]}, {u'status': u'SUPPORTED', u'id': u'v2.2'

详解Python中的序列化与反序列化的使用

  这篇文章主要介绍了详解Python中的序列化与反序列化的使用,针对pickle和cPickle对象进行了探究,需要的朋友可以参考下 学习过marshal模块用于序列化和反序列化,但marshal的功能比较薄弱,只支持部分内置数据类型的序列化/反序列化,对于用户自定义的类型就无能为力,同时marshal不支持自引用(递归引用)的对象的序列化.所以直接使用marshal来序列化/反序列化可能不是很方便.还好,python标准库提供了功能更加强大且更加安全的pickle和cPickle模块. cP

浅析Python中的序列化存储的方法

  这篇文章主要介绍了Python中的序列化存储的方法,序列化存储主要针对的是内存和硬盘之间的写入操作,需要的朋友可以参考下 在程序运行的过程中,所有的变量都是在内存中,比如,定义一个dict: ? 1 d = dict(name='Bob', age=20, score=88) 可以随时修改变量,比如把name改成'Bill',但是一旦程序结束,变量所占用的内存就被操作系统全部回收.如果没有把修改后的'Bill'存储到磁盘上,下次重新运行程序,变量又被初始化为'Bob'. 我们把变量从内存中变

php中serialize序列化与json性能测试的示例分析_php实例

最近需要对大数组做存储,需要在serialize序列化和json之间做了选择.因此需要做了性能测试. 在php5.2之前对数组存储的时候,大都使用serialize系列化.php5.2之后,开始内置了 JSON 的支持. 在网上看到有些资料说:json_encode和json_decode比内置的serialize和unserialize函数要高效.耳闻不如眼见,眼见不一定为实.那就用实际数据测试吧..... 我们先理解概念: 一. 序列化 序列化是将对象状态转换为可保持或可传输的格式的过程.与

《Spark大数据分析:核心概念、技术及实践》一1.2 数据序列化

  本节书摘来自华章出版社<Spark大数据分析:核心概念.技术及实践>一书中的第1章,第1.2节,作者[美] 穆罕默德·古勒(Mohammed Guller),更多章节内容可以访问"华章计算机"公众号查看. 1.2 数据序列化 数据有自己的生命周期,独立于创建或使用它的程序.大多数情况下,数据比创建它的应用存活得更久.一般来说,数据保存在硬盘上.有时,也会通过网络把数据从一个应用发送给另一个应用. 在硬盘上存储或通过网络发送的数据格式与数据在内存中的格式是不一样的.把内存

Python基础数据存储学习笔记

pickle是标准库中的一个模块,在Python 2中还有一个cpickle,两者的区别就是后者更快.所以,下面操作中,不管是用 import pickle ,还是用 import cpickle as pickle ,在功能上都是一样的. 而在Python 3中,你只需要 import pickle 即可,因为它已经在Python 3中具备了Python 2中的cpickle同样的性能. pickle.dump(obj,file[,protocol]) obj:序列化对象,在上面的例子中是一个

php 中序列化和json使用介绍

[序列化的概念] 序列化是将对象状态转换为可保持或可传输的格式的过程.与序列化相对的是反序列化,它将流转换为对象.这两个过程结合起来,可以轻松地存储和传输数据. 将对象的状态信息转换为可以存储或传输的窗体的过程. 在序列化期间,对象将其当前状态写入到临时或持久性存储区.以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象. 通常,对象实例的所有字段都会被序列化,这意味着数据会被表示为实例的序列化数据.这样,能够解释该格式的代码有可能能够确定这些数据的值,而不依 赖于该成员的可访问性.

如何用 Sketch 打造「前端框架」

本文讲的是如何用 Sketch 打造「前端框架」, 前端框架 需要考虑的事项: 当我们与一大群设计师同时推进同一个项目的时候,要做到协调一致非常困难.而在面对有审美要求.对指定行为和互动有明确要求的系统性项目时尤为如此. 我们可用于建立界面的标准化的手段之一就是定义一份风格指南(纯视觉角度),这样可以帮助整个设计团队避免在未来可能出现的改动带来的不必要的工作时间,提高工作效率.让我们可以把精力更好的集中在组件的行为和应用中的交互上. 一份优秀的风格指南需要被团队全员采用,比如开发者.产品负责人.