Python序列化模块 - pickle与json
Synopsis: Python语言特定的序列化模块是pickle,但如果要把序列化搞得更通用、更符合Web标准,就可以使用json模块。json模块的dumps()和loads()函数是定义得非常好的接口的典范。当我们使用时,只需要传入一个必须的参数。但是,当默认的序列化或反序列机制不满足我们的要求时,我们又可以传入更多的参数来定制序列化或反序列化的规则,既做到了接口简单易用,又做到了充分的扩展性和灵活性
1. pickle
Python程序运行时,对象都存在于内存中,一旦程序结束,这些对象所占用的内存就被操作系统全部回收。可以使用pickle
模块将对象保存到磁盘文件中,这种将对象从内存中变成可存储或可传输的过程叫做序列化
,序列化之后,就可以把序列化后的内容写入磁盘,或者通过网络传输到别的机器上。反过来,把变量内容从序列化的对象重新读到内存里称之为反序列化
(unpickling)
1.1 pickle.dumps()
pickle.dumps()
方法把任意对象序列化成一个bytes
,然后,就可以把这个bytes
写入一个file-like object
,比如使用open()
方法中的wb
模式打开的文件描述符、BytesIO,参考:http://www.madmalls.com/blog/post/read-write-files-in-python/#62-bytesio
In [1]: import pickle In [2]: d = {'name': 'wangy', 'age': 18} In [3]: pickle.dumps(d) Out[3]: b'\x80\x03}q\x00(X\x04\x00\x00\x00nameq\x01X\x05\x00\x00\x00wangyq\x02X\x03\x00\x00\x00ageq\x03K\x12u.' In [4]: b = pickle.dumps(d) In [5]: b Out[5]: b'\x80\x03}q\x00(X\x04\x00\x00\x00nameq\x01X\x05\x00\x00\x00wangyq\x02X\x03\x00\x00\x00ageq\x03K\x12u.' In [6]: f = open('/tmp/test.txt', 'xb') In [7]: f.write(b) Out[7]: 43 In [8]: f.close()
此时,创建了/tmp/test.txt
文件,里面的数据就是刚写入的字节流,但是无法正常查看内容:
[root@CentOS ~]# file /tmp/test.txt /tmp/test.txt: 8086 relocatable (Microsoft) [root@CentOS ~]# cat /tmp/test.txt }q(XnameqXwangyqXageqKu.[root@CentOS ~]#
1.2 pickle.dump()
pickle.dump()
方法直接
将对象序列化后写入一个file-like object
,比如使用open()
方法中的wb
模式打开的文件描述符、BytesIO,参考:http://www.madmalls.com/blog/post/read-write-files-in-python/#62-bytesio
In [1]: import pickle In [2]: d = {'name': 'wangy', 'age': 18} In [3]: f = open('/tmp/test2.txt', 'xb') In [4]: pickle.dump(d, f) In [5]: f.close()
1.3 pickle.loads()
可以先以rb
模式打开上一步骤中的文件,返回bytes
,然后用pickle.loads()
反序列化出之前的字典对象(只是内容相同,是不同的对象,id不同):
In [1]: import pickle In [2]: f = open('/tmp/test.txt', 'rb') In [3]: b = f.read() In [4]: b Out[4]: b'\x80\x03}q\x00(X\x04\x00\x00\x00nameq\x01X\x05\x00\x00\x00wangyq\x02X\x03\x00\x00\x00ageq\x03K\x12u.' In [5]: d = pickle.loads(b) In [6]: d Out[6]: {'name': 'wangy', 'age': 18} In [7]: f.close()
1.4 pickle.load()
pickle.load()
方法直接从一个file-like object
中反序列化出对象
In [1]: import pickle In [2]: f = open('/tmp/test.txt', 'rb') In [3]: d = pickle.load(f) In [4]: d Out[4]: {'name': 'wangy', 'age': 18} In [5]: f.close()
0 条评论
评论者的用户名
评论时间暂时还没有评论.