这些模块都是用于数据存储和传递的,具有数据的序列化与反序列化功能.

JSON模块

JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。 易于人阅读和编写。同时也易于机器解析和生成。 它基于JavaScript Programming Language, Standard ECMA-262 3rd Edition – December 1999的一个子集。 JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C, C++, C#, Java, JavaScript, Perl, Python等)。 这些特性使JSON成为理想的数据交换语言。
从名字可以看出JSON这种数据格式来源于JavaScript,前端开发正好需要的是JS语言,而且JSON适用于不同程序之间交换数据,比python的pickle库更加实用.所以推荐使用JSON模块来存储和交换数据.
Json和Pickle都是一种序列化方法.
程序存储数据的本质是将数据存储到外部存储设备上,对于在程序间交换数据,具体指的是程序保存数据结构为文件,另外一个程序打开文件并从中还原出数据结构并使用.
在未使用JSON数据处理模块的时候,以前存数据到文件并读取解析的时候经常采用eval()函数,但是eval()无法存放例如函数,类等数据,而且解析起来比较麻烦.有了JSON之后,可以不在关心对字符的处理,只要按照一定的抽象规则存放即可.

JSON使用方法:
1 将数据转换成JSON数据格式(JSON字符串)

# 转换数据成为JSON字符串,显示之后可以发现字符串的单引号变成了双引号.
data = [1, 2, 3, ('test', 'python'), {'name': "minko", 'age': 18}]
json_data = json.dumps(data)
print(json_data, type(json_data), sep='\n', end='')

2 将数据存储在文件内.采用普通的open()函数可以写文件.

with open('test.json','w') as f:
    f.write(json_data)

3 用JSON模块将文件内存储的数据还原为数据类型

with open('test.json','r') as f:
    data_from_json_file = json.loads(f.read())
print(data_from_json_file, type(data_from_json_file), sep='\n', end='') #读取完之后,发现data_from_json_file的数据类型是列表,与原数据data的数据类型一样,说明json还原了原数据.

JSON模块的主要方法:

json.dump(data,file_object) data需要转换成JSON格式的原数据,file_object是一个文件对象(file_like_object).通常在打开一个文件之后,可以用此命令直接将json字符串写入文件.
json.load(file_object) 从文件里读取json格式的数据并解析,只能用于文件操作.
json.dumps(data) 生成一个JSON数据类型.
json.loads(file_content or string) 从文件读取的内容里解析JSON数据,file_content需要用file_like_object.read()来生成.dump和load的适用范围比dumps和loads要窄,只用于文件操作.一般打开文件还会有其他操作,所以虽然可能写的代码多一些,但推荐使用dumps和loads.

如果一个文件内的字符串即使不是JSON生成,但是满足JSON规范,直接可以用json.loads()来读取.

PICKLE模块

pickle模块将数据转换成字节码,不像JSON转换成的是JSON规格的字符串.也因此pickle只能适用于python程序直接传递数据.
Pickle使用方法:
1 将数据转换成pickle格式

# 转换后的p_data是一串字节,数据类型是bytes
data = [1, 2, 3, ('test', 'python'), {'name': "minko", 'age': 18}]
p_data = pickle.dumps(data)
print(p_data, type(p_data))

2 将数据写入文件,将pickle写入文件的时候需要用b模式

# 写入之后打开文件发现内容是二进制,并不是字符串.因为pickle是保存的字节码.
with open('test','wb') as f:
    f.write(p_data)

3 从文件读取pickle数据,打开的时候也需要用b模式

with open('data.pickle','rb') as f:
    pdata= pickle.load(f)

Pickle的dump-load,dumps-loads与JSON的用法完全相同.如果在python内部传递数据,采用pickle模式是比较高效的,因为pickle保存的是字节码,不用再次经过解释.此外pickle可以保存函数或者对象,在取得的时候直接将函数或者对象赋给变量,但是很少传递函数及对象,只有特殊情况下才需要.

SHELVE模块

shelve模块比json和pickle更加简单,也是用于序列化数据,只有一个方法open()
shelve模块通过open()方法拿到一个文件的句柄,然后用类似字典的方式操作.这个数据文件本身就可以看成一个字典,可以用类似内置函数open()的方式打开和关闭,用字典的方式取数据和添加记录.
shelve的使用方法:

1 打开一个文件

import shelve
f = shelve.open('data')  #建立一个名叫data的文件,被shelve取得句柄,可以将其理解为空字典,同时也是一个文件对象.

2 向shelve文件内添加数据,用类似字典的方式操作.

f = shelve.open('shelve')  # 获得一个shevel文件对象,向里边写入键值对
f['item1'] = '三鹅'
f['item2'] = {'name': 'jenny', 'age': 33}
f['item3'] = [1,2,3,4]
f.close()

3 从shelve文件中取数据.

with shelve.open('shelve') as f:
    data1 = f.get('item1')
    data2 = f['item2']['name']
    data3 = f['item3'][3]
    print(data1,data2,data3,sep='\n')

可见就是把一个shelve文件当做一个字典来操作就可以,这个字典以shelve特有的组织数据方式存放.