json和pickle
序列化
我们把对象(变量)从内存中变成可储存或传输的过程称为序列化,在Python中叫pickling,在其他语言中也被称为serialiazation, marshalling, flattening。比如一个字典类型的变量是不能直接写入文件的,需要先转为字符串再写入文件。
序列化之后可以把序列化后的内容写入磁盘,或者通过网络传输到其他机器上。反过来把变量内容从序列化的对象重新读到内存称之为反序列化,即unpickling。
json
如果在不同的编程语言中传递对象,就必须把对象序列化为标准格式,比如XML,但更好的方法是序列化为JSON,JSON表达出来是一个字符串,可以被所有语言读取,也方便存储和传输。JSON不仅是标准格式,比XML更快,而且可以直接在Web页面中读取,非常方便。
JSON表示的对象就是标准的JavaScript语言的对象。
来看下面的例子,把一个字典写入txt文件:
import json
dict = {'name': 'Meng', 'age': '20'}
data = json.dumps(dict) # 序列化过程
f = open('json_test.txt', 'w')
f.write(data)
f.close()
打开json_test.txt,可以看到{"name": "Meng", "age": "20"}
,从txt文件取出字典的过程是这样的:
import json
f = open('json_test.txt', 'r')
data = f.read()
data = json.loads(data) # 反序列化过程
print(data['name']) # 'Meng'
f.close()
JSON支持对绝大部分基本数据类型的序列化,但是对于函数、类这些比较复杂的数据类型是不支持的。
JSON的dump和load方法是与dumps和loads的功能是完全相同的,只不过在调用时参数不同:
# data = json.dumps(dict)
# f.write(data)
json.dump(dict, f)
# data = f.read()
# data = json.loads(data)
data = json.load(f)
pickle
pickle只能用于python之间传输。下面用pickle把函数写入txt文件:
import pickle
def func():
print('function')
data = pickle.dumps(func)
f = open('pickle_test.txt', 'wb') # 转换为二进制,所以改为'wb'的写入方式
f.write(data)
f.close()
打开pickle_test.txt,由于是二进制打开是乱码,所以pickle相对于json不容易理解。pickle取出函数的过程如下:
import pickle
# 要注意写入文件的实际上只是函数的内存地址,所以读出时也要有func的定义才是合法的,在两台电脑传输过程中,必须都有func的定义才行
def func():
print('function')
f = open('pickle_test.txt', 'rb')
data = f.read()
data = pickle.loads(data)
data()
f.close()
shelve
shelve模块很简单,只有一个open函数,返回一个类似字典的可读可写对象,key必须是字符串,value可以是python支持的其他数据类型:
import shelve
f = shelve.open(r'SHELVE_test.txt')
f['stu1'] = {'name': 'Meng', 'age': '20'}
f['stu2'] = {'name': 'Lu', 'age': '19'}
print(f.get('stu1')) # {'name': 'Meng', 'age': '20'}
f.close()