Python序列化模块 - pickle与json

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

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()

2. JSON

  • Miao jingjing
  • A cash fortune is standing by ysgkeggmai.temp.swtest.ru 25
  • Get Rewarded Just for Being cd364155.tw1.ru MQ
  • Mark the holiday with a special cash present cd364155.tw1.ru 3Q
  • Land a Financial Bonus Today ysgkeggmai.temp.swtest.ru jj
  • Unlock Universal Cashback ysgkeggmai.temp.swtest.ru 14
  • Access your exclusive time of year bonus cy559489.tw1.ru Nh
  • Your VIP pass includes cash access ysgkeggmai.temp.swtest.ru 0G
  • The work is done; here's your easy money cy559489.tw1.ru zl
  • Secure Quick Extra Funds ysgkeggmai.temp.swtest.ru kY
  • Reveal Hidden Discounts and Money cy559489.tw1.ru 2H
  • Your VIP status grants cash access cy559489.tw1.ru tD
  • Earn Money in Raffles and Sweepstakes cy559489.tw1.ru HM
  • You are among the selected for a cash reward cy559489.tw1.ru Jc
  • Claim an Unannounced Bonus cd364155.tw1.ru 9Q
  • Collect Your Confidential Bonus ysgkeggmai.temp.swtest.ru f5
  • This Saturday Sunday cash offer won't last cd364155.tw1.ru 3y
  • We've prepared a unique reward for you cy559489.tw1.ru VJ
  • Effortlessly Earn a Financial Payout cd364155.tw1.ru fv
  • Your extra reward expires at midnight tonight cd364155.tw1.ru KU
  • Profit from Unpredictable Micro Tasks cd364155.tw1.ru fl
  • Your hidden monetary reward awaits discovery cy559489.tw1.ru qK
  • Instant Gratification Your Money Prize cy559489.tw1.ru CU
  • Connect now to receive a monetary bonus cd364155.tw1.ru io
未经允许不得转载: LIFE & SHARE - 王颜公子 » Python序列化模块 - pickle与json

分享

作者

作者头像

Madman

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

0 条评论

暂时还没有评论.

专题系列