Python序列化模块 - pickle与json

  • 原创
  • Madman
  • /
  • /
  • 0
  • 2861 次阅读

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.
                                
                            
未经允许不得转载: LIFE & SHARE - 王颜公子 » Python序列化模块 - pickle与json

分享

作者

作者头像

Madman

如需 Linux / Python 相关问题付费解答,请按如下方式联系我

0 条评论

暂时还没有评论.

专题系列