Python 内置模块 之 序列化 json & pickle

序列化

把变量从内存中变成可存储或传输的过程( 列表,字典是内存数据结构,硬盘只认字符串),可以把序列化后的内容写入磁盘,或者通过网络传输到别的机器上。

反之,把变量内容从序列化的对象重新读到内存里称之为反序列化

 

用途:

1. 两个程序之间进行数据类型交换,可以是不同编程语言的程序。

2. 保存状态

 

Python 提供的序列化的两个模块:

  • json,用于json 字符串 和 python数据类型间进行转换
  • pickle,用于python特有的类型 和 python的数据类型间进行转换

json

如果要在不同的编程语言之间传递对象,就必须把对象序列化为标准格式,比如XML。但更好的方法是序列化为JSON,因为JSON表示出来就是一个字符串,可以被所有语言读取,也可以方便地存储到磁盘或者通过网络传输。

JSON表示的对象就是标准的JavaScript语言的对象,JSON不仅是标准格式,比XML更快,且可以直接在Web页面中读取。

Python内置的json模块也提供了非常完善的Python对象到JSON格式的转换。

Json模块提供四个方法:dumps、dump、loads、load

  • dumps(data) 将数据序列化为JSon格式的字符串
  • dump(data, fp) 将数据序列化为JSon格式的字符串,并写入文件。dump至少要有两个参数
  • loads() 将JSon格式的字符串反序列化为Python的数据类型
  • load() 将保存在文件对象中的JSon格式的字符串反序列化为Python的数据类型
>>> dc={'k1':1, 'k2':2}
>>> print(json.dumps(dc))
{"k1": 1, "k2": 2}

>>> with open('/tmp/test.txt','w') as fp: ... json.dump(dc,fp)
等同于: >>>
with open('/tmp/test.txt','w') as fp: ... fp.write(json.dumps(dc))

# cat /tmp/test.txt
{"k1": 1, "k2": 2}

>>> with open('/tmp/test.txt','r') as fp:
...     us=json.load(fp)
...     print(us)
等同于:
>>> with open('/tmp/test.txt','r') as fp:
...     us=json.loads(fp.read())
...     print(us)
{"k1": 1, "k2": 2}

 

pickle

json 所有语言通用,但仅支持对一部分数据类型进行序列化,如列表,元组,字典等。

pickle 是python语言独有模块,因此仅能在Python程序中使用,支持的序列化类型不仅只有字典、列表,还有函数、类、甚至程序,包括几乎所有的数据类型

pickle 模块也提供四个方法:dumps、dump、loads、load

  • dumps(data) 将数据序列化为byte
  • dump(data, fp) 将数据序列化为byte,并写入文件。dump至少要有两个参数
  • loads() 将序列化后的byte 反序列化为Python的数据类型
  • load() 将保存在文件对象中序列化的byte 反序列化为Python的数据类型
>>> dc={'k1':1, 'k2':2}
>>> print
(pickle.dumps(dc)) b'\x80\x03}q\x00(X\x02\x00\x00\x00k1q\x01K\x01X\x02\x00\x00\x00k2q\x02K\x02u.'

>>> with open('/tmp/test.txt','wb') as fp:
...     pickle.dump(dc,fp)
等同于:
>>> with open('/tmp/test.txt','wb') as fp:
...     fp.write(pickle.dumps(dc))

>>> with open('/tmp/test.txt','rb') as fp:
...     us=pickle.load(fp)
...     print(us)
...     

{'k1': 1, 'k2': 2}
等同于:
>>> with open('/tmp/test.txt','rb') as fp:
...     us=pickle.loads(fp.read())
...     print(us)
...     
{'k1': 1, 'k2': 2}
 
posted @ 2017-07-01 15:10  bobo0609  Views(185)  Comments(0Edit  收藏  举报