python模块之pickle、shelve、json

一 什么是序列化

序列化指的是将内存中的数据结构转化为一种中间格式,并存储到硬盘上。

(反序列化:将硬盘上存储的中间格式数据再还原为内存中的数据结构)

二 为什么要序列化

  1. 持久保持状态

需知一个软件/程序的运行就是处理一系列状态的变化,在编程语言中,‘状态‘会以各种有结构的数据类型(也可以称之为变量)的形式保存在内存中。

内存是无法永久保存数据的,当程序运行了一段时间,我们断电或者重启程序,内存中关于这个程序之前一段时间的数据都会被清空。

在断电或重启程序之前将程序当前运行的数据保存下来,便于下次程序执行能够从文件中载入之前的数据,然后继续执行,这就是序列化。

  1. 数据跨平台交互

序列化数据之后,不仅可以把序列化后的内容写入硬盘,还可以通过网络传输到别的机器上,如果收发的双方约定都使用一种序列化的格式,那么便打破了平台和语言带来的限制,实现了跨平台交互。

反过来,把变量内从从序列化的对象重新读到内存里称之为反序列化,即unpicking。

三 序列化数据的三个模块

一 pickle模块

pickle模块时python内置的用来序列化python数据格式的模块,支持序列化python中所有的数据类型,主要方法有四个;

  1. dumps
import pickle
name = 'musibii'
age = 18
height = 1.7
user = {'name': name, 'age': age, 'height': height}
with open('userinfo.pkl', 'wb') as f:
    userbytes = pickle.dumps(user)
    f.write(userbytes)
  1. loads
import pickle
with open('userinfo.pkl', 'rb') as f:
    userbytes = f.read()
    user = pickle.loads(userbytes)
    print(user)

与dumps和loads对应的两个方法更简单。

  1. dump
import pickle
with open('userinfo.pkl', 'wb') as f:
    pickle.dump(user, f)
  1. load
import pickle
with open('userinfo.pkl', 'rb') as f:
    user = pickle.load(f)
    print(user)

二 shelve模块

shevlve模块也用于序列化,它和pickle模块不同的地方在于,不需要关心文件模式,直接把数据当成字典来看待。而且shelve模块可以直接对数据进行修改,而不用覆盖之前的数据,但pickle要想修改的话只能使用wb模式覆盖

shelve只有一个方法open,所以使用起来也很方便。同样的,shelve也支持python中所有的数据格式。

import shelve
user = {'name': 'musibii'}
s = shelve.open('userdb.shv')
s['user'] = user
s.close()

三 json模块

1 json是什么

JSON是Java script object notation的缩写,翻译过来就是js对象标识法。

对于开发者而言,json是一种通用的数据格式,任何语言都能解析,所以每种语言都会有处理json格式数据的需求。

  1. json语法
js 中的数据类型  python数据类型 的对应关系
{}              字典
[]              list
string ""       str
int/float       int/float
true/false      True/False
null            None
  1. json格式的语法规范

最外层通常是一个字典或列表

{}or[],如果想定义json格式的数据,那么最外层直接写{},而且json中的字符串必须是双引号,json理论上可以嵌套任意多的层次。

2 为什么用json

虽然之前的pickle和shelve都很强大,而且使用也非常方便,那么为什么还出来json呢?这是因为pickle和shevle序列化之后的数据只有python才能解析出来,而通常在实际生产开发中,都是需要数据可以跨平台使用的。

3 json的使用

json模块的核心方法

  • dump
  • dumps
  • load
  • loads

不带s的直接封装了write和read方法。

  1. dump
import json
jsontext = """{
	"users": [{
			"name": "musibii",
			"age": 18
		},
		{
			"name": "thales",
			"age": 23
		}
	]
}"""
with open('a.json', 'wt', encoding='utf-8') as f:
    json.dump(jsontext, f)
  1. dumps
import json
jsontext = """{
	"users": [{
			"name": "musibii",
			"age": 18
		},
		{
			"name": "thales",
			"age": 23
		}
	]
}"""
with open('a.json', 'wt', encoding='utf-8') as f:
    f.write(json.dumps(jsontext))
  1. load
import json
with open('a.json', 'rt', encoding='utf-8') as f:
    print(json.load(f))
  1. loads
import json
with open('a.json', 'rt', encoding='utf-8') as f:
    res = json.loads(f.read())
    print(res)
posted @ 2018-10-18 21:13  rsuxwvilc  阅读(146)  评论(0编辑  收藏  举报