python 学习笔记(12)序列化python 对象

 

一、pickle 模块存储

         1、存储对象

           所有Python支持的 原生类型 : 布尔整数浮点数复数字符串, bytes(字节串)对象字节数组以及 None.  

           由任何原生类型组成的列表,元组,字典和集合。  

           由任何原生类型组成的列表,元组,字典和集合组成的列表,元组,字典和集合(可以一直嵌套下去,直至Python支持的最大递归层数).  

           函数,类,和类的实例(带警告) 

         2、使用文件进行序列化

         pickle模块中的dump()函数接受一个可序列化的Python 数据结构, 使用最新版本的pickle协议将其序列化为一个二进制的,Python特定的格式,并且保存到一个打开的文件里。

         注意::

  •    pickle模块接受一个Python数据结构并将其保存的一个文件。
  • 要做到这样,它使用一个被称为“pickle协议的东西序列化该数据结构。
  • pickle 协议是Python特定的,没有任何跨语言兼容的保证。你很可能不能使用Perl, php, Java, 或者其他语言来对你刚刚创建的entry.pickle文件做任何有用的事情。
  • 并非所有的Python数据结构都可以通过pickle模块序列化。随着新的数据类型被加入到Python语言中,pickle协议已经被修改过很多次了,但是它还是有一些限制。
  • 由于这些变化,不同版本的Python的兼容性也没有保证。新的版本的Python支持旧的序列化格式,但是旧版本的Python不支持新的格式(因为它们不支持新的数据类型)
  • 除非你指定,pickle模块中的函数将使用最新版本的pickle协议。这保证了你对可以被序列化的数据类型有最大的灵活度,但这也意味着生成的文件不能被不支持新版pickle协议的旧版本的Python读取。
  • 最新版本的pickle协议是二进制格式的。请确认使用二进制模式来打开你的pickle文件,否则当你写入的时候数据会被损坏。

 

    pickle.load()函数接受一个流对象, 从流中读取序列化后的数据,创建一个新的Python对象,在新的Python对象中重建被序列化的数据,然后返回新建的Python对象。

    pickle.dump() / pickle.load()一对循环的结果是一个和原始数据结构等同的新的数据结构。

    pickle.dump()是将一堆要保存的数据通过pickle.dump()方法序列化后保存到磁盘中的文件,而pickle.load()是从用pickle.dump()写入数据的文件中读取序列化的数据进行解析;

    3、不使用文件进行序列化

  pickle.dumps()函数(注意函数名最后的's')执行和pickle.dump()函数相同的序列化。取代接受流对象并将序列化后的数据保存到磁盘文件,这个函数简单的返回序列化的数据。

  由于pickle协议使用一个二进制数据格式,所以pickle.dumps()函数返回bytes对象。

  pickle.loads()函数(再一次, 注意函数名最后的's') 执行和pickle.load()函数一样的反序列化。取代接受一个流对象并去文件读取序列化后的数据,它接受包含序列化后的数据的bytes对象, 比如pickle.dumps()函数返回的对象。

 

但是,不用文件进行序列化的话,是不能进行保存到磁盘的。

    4Python3 可以读取版本 2 pickle协议生成的数据, Python 2 不能读取版本 3的协议生成的数据

         5、调试Pickle 文件

                   pickle.dis()函数反汇编的输出pickle协议生成的文件的内容;

二、JSON序列化Python对象以供其它语言读取(java script object notation)

         1json 是被设计为跨语言使用的。

         2json模块。同 pickle模块类似, json模块包含一些函数,可以序列化数据结构,保存序列化后的数据至磁盘,从磁盘上读取序列化后的数据,将数据反序列化成新的Pythone对象。但两者也有一些很重要的区别。首先, json数据格式是基于文本的, 不是二进制的。RFC 4627 定义了json格式以及怎样将各种类型的数据编码成文本。比如,一个布尔值要么存储为5个字符的字符串'false',要么存储为4个字符的字符串 'true'。所有的json值都是大小写敏感的。

         3、由于是文本格式, 存在空白(whitespaces)的问题。 json 允许在值之间有任意数目的空白(空格, 跳格, 回车,换行)。空白是“无关紧要的”,这意味着json编码器可以按它们的喜好添加任意多或任意少的空白, json解码器被要求忽略值之间的任意空白。这允许你“美观的打印(pretty-print)”你的 json 数据, 通过不同的缩进层次嵌套值,这样你就可以在标准浏览器或文本编辑器中阅读它。Python json 模块有在编码时执行美观打印(pretty-printing)的选项。

        4、字符编码的问题是长期存在的。json 用纯文本编码数据, “不存在纯文本这种东西。” json必须以Unicode 编码(UTF-32, UTF-16, 或者默认的, utf-8)方式存储, RFC 4627的第3节定义了如何区分使用的是哪种编码

 

5json使用

         1)导入包

                   import json

         2)pickle模块一样, json 模块定义了dump()函数,它接受一个Python数据结构和一个可写的流对象。dump() 函数将Python数据结构序列化并写入到流对象中。在with语句内工作保证当我们完成的时候正确的关闭文件。

         3)严格注意json的编码格式

         4)如果你给json.dump()函数传入indent参数, 它以文件变大为代价使生成的json文件更可读。indent 参数是一个整数。0 意味着“每个值单独一行。”大于0的数字意味着“每个值单独一行并且使用这个数目的空格来缩进嵌套的数据结构。”

         5json 有数组类型, json 模块将其映射到Python的列表, 但是它没有一个单独的类型对应“冻结数组(frozenarrays) (元组)。而且尽管 json 非常好的支持字符串,但是它没有对bytes 对象或字节数组的支持。

         6)json.dump(data,fd, default = function)

                   自定义一个函数去处理json不能处理的数据类型    序列化的数据结构可能包含json内建的可序列化类型和你的定制序列化器支持的类型之外的东西。在这种情况下,你的定制序列化器抛出一个TypeError,那样json.dump() 函数就可以知道你的定制序列化函数不认识该类型。

         7)json.load(fd,object_hook=d_function)

         json.load()并不知道你可能传给json.dump()的任何转换函数的任何信息。你需要的是函数的逆函数—一个接受定制转换出的json对象并将其转换回原始的Python数据类型。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值