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}