您的位置:首页 > 编程语言 > Python开发

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

2013-05-14 17:05 501 查看
 

一、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()函数返回的对象。

 

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

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

         5、调试Pickle
文件

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

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

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

         2、json模块。同 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节定义了如何区分使用的是哪种编码

 

5、json使用

         1)导入包

                   import json

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

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

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

         5)json
有数组类型, 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数据类型。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: