情景
例1 dic = str({‘age‘:‘18‘}) f = open(‘text‘,‘w‘) f.write(dic) f.close() 例2 f = open(‘text‘,‘r‘) data = f.read() print(eval(data)[‘age‘])
当我们将内存数据对象存储到文件中,是无法直接将字典对象存储,必须转化为字符串格式str(),当我们通过f.read()方法读取文件中存储的字典格式对象时,读取的也是字符串个是,必须用eval()方法转化,这种方法很Lou。
用于序列化的两个模块
- json,用于字符串 和 python数据类型间进行转换
- pickle,用于python特有的类型 和 python的数据类型间进行转换
Json模块提供了四个功能:dumps、dump、loads、load
pickle模块提供了四个功能:dumps、dump、loads、load
json模块
再上面的情形中,更好的方法是通过Json模块,因为JSON表示出来就是一个字符串,可以被所有语言读取,也可以方便地存储到磁盘或者通过网络传输。JSON不仅是标准格式,并且比XML更快,而且可以直接在Web页面中读取,非常方便。
import json dic = {‘age‘:‘28‘} #写入文件 data = json.dumps(dic) f = open(‘text‘,‘w‘) f.write(data) f.close() #读取文件 f = open(‘text‘,‘r‘) data = f.read() content = json.loads(data) print(content[‘age‘])
-
json无法转化函数和类
pickle模块
Pickle的问题和所有其他编程语言特有的序列化问题一样,就是它只能用于Python,并且可能不同版本的Python彼此都不兼容,因此,只能用Pickle保存那些不重要的数据,不能成功地反序列化也没关系。
import pickle def foo(): print(‘ok‘) #写入文件 data = pickle.dumps(foo) f = open(‘text‘,‘wb‘) f.write(data) f.close() #读取文件 f = open(‘text‘,‘rb‘) data = f.read() content = pickle.loads(data) content() #Can‘t get attribute ‘foo‘ on <module ‘__main__‘ from ‘C:/Users/LG/PycharmProjects/mystuff/March/day23/json_module.py‘>
- 注意:写入模式必须为wb、rb
- 读取文件是报错是由于找不到函数内存地址,所以如果想要读取时,函数必须在内存地址。
dump & load 方法
1. dump
import json dic = {‘age‘:‘28‘} f = open(‘text‘,‘w‘) json.dump(dic,f) f.close()
- dump将进行转化与写入的过程
2. load
import json f = open(‘text‘,‘r‘) data = json.load(f) print(data[‘age‘]) f.close()
- load将进行转化与读取的过程