根据数据集创建决策树的速度比较慢,即使数据量比较小,也需要几秒钟的时间,因此为了方便起见,在执行一次程序后,创建好树就把这棵保存起来,创建好的树是字典形式,由于写入和读出的必须是字符串格式,所以写入和读取需要使用到序列化和反序列化
方法一:使用json模块
def storeTree(inputTree,filename): import json fw = open(filename, 'w') #只需要'w' fw.write( json.dumps(inputTree) ) fw.close() def grabTree(filename): import json fr = open(filename, 'r') #只需要'r' data = json.loads( fr.read() ) fr.close() return data
json创建的文本内容是正常显示的内容
json方法只能处理字符串,列表,字典等简单的数据类型,内存地址形式就不能处理方法二:使用pickle模块
def storeTree(inputTree,filename): import pickle fw = open(filename, 'wb') #用pickle序列化后的是二进制,所以此处用wb,以二进制写入,不然默认以字符串写入会出错 fw.write( pickle.dumps(inputTree) ) fw.close() def grabTree(filename): import pickle fr = open(filename, 'rb') #用'rb' data = pickle.loads( fr.read() ) fr.close() return data
pickle创建的文本内容是有看似乱码实则是有对应关系的内容
import json import pickle myTree = {'no surfacing': {0: 'no', 1: {'flippers': {0: 'no', 1: 'yes'}}}} print(json.dumps(myTree)) myTree = {'no surfacing': {0: 'no', 1: {'flippers': {0: 'no', 1: 'yes'}}}} print(pickle.dumps(myTree))
{"no surfacing": {"0": "no", "1": {"flippers": {"0": "no", "1": "yes"}}}} b'\x80\x03}q\x00X\x0c\x00\x00\x00no surfacingq\x01}q\x02(K\x00X\x02\x00\x00\x00noq\x03K\x01}q\x04X\x08\x00\x00\x00flippersq\x05}q\x06(K\x00h\x03K\x01X\x03\x00\x00\x00yesq\x07usus.' #两种结果,一种是正常显示,一种是二进制