JSON(JavaScript Object Notation)是一种轻量级的数据交换格式
由于文件在内存中只能以二进制、字符串的形式存储。当存储字典、函数的时候,就需要使用json序列化。json就好比是虚拟机中的挂起,随时打开,随时挂起。
一、存储字典数据
1、json序列化数据
import json info = {‘age‘:22,‘name‘:‘peter‘,‘email‘:‘@qq.com‘} f = open(‘test.txt‘,‘w‘) #打开test.txt文件,并写入 f.write(json.dumps(info)) #json.dumps对数据进行编码,不负责写入! print (json.dumps(info)) #打印json.dumps编码后的数据 f.close()
此时数据已经以字符串的形式存储在硬盘。如果只取出其中[age]的数据,下面的例子是无法提取数据的。
2、错误示范
f = open(‘test.txt‘,‘r‘) date = f.read() print (date[‘age‘]) f.close()
原因分析:因为数据只能以字符串、二进制的形式存储,直接以字典的形式“date[age]”是绝对无法提取的。
3、json反序列化数据
import json f = open(‘test.txt‘,‘r‘) #打开test.txt文件,并读取 date = json.loads(f.read()) #json.loads对数据进行解码 print (date[‘age‘]) print (date[‘name‘]) f.close()
经过json.loads解码的数据将恢复成源数据的样式,可以直接输出。
4、另一种简单方法(eval()方法)
f.open(‘test.txt‘,‘r‘) date = eval(f.read()) print (date([‘age‘])) f.close()
二、存储函数(pickle)
json只能处理简单的数据类型,例如:字典、列表等。无法处理函数。json在所有语言中都通用,可以用于不同语言之间交互。
pickle可以处理复杂的数据,使用方式和json一模一样!pickle只适用于python
1、pickle序列化数据
import pickle def hello(name): print (‘hello!‘,name) info = { ‘age‘:22,‘name‘:‘peter‘,‘email‘:‘@qq.com‘, ‘func‘:hello} #函数hello的内存地址传递给func f = open(‘test1.py‘,‘wb‘) #pickle.dumps()直接将数据转发为二进制存储,因此需要用‘wb‘ print (pickle.dumps(info)) #打印pickle编码后的数据 f.write(pickle.dumps(info)) #写入编码后数据 f.close()
析:pickle具有一套语法规则,编码后的数据在文件中是以一种类似“乱码”的样子存储
2、pickle反序列化(错误示范)
import pickle f = open(‘test1.txt‘,‘rb‘) #存储的二进制,必须用‘re‘读取 date = pickle.loads(f.read()) print (date)
原因分析:此时是无法执行的。因为test1.txt中存储了一个函数“hello”,当序列化的代码执行完之后,函数“hello”的内存地址就会被释放,因此字典info中‘func’就没有值。
3、pickle反序列化(正确示范)
import pickle def hello(name): print (‘hello,hello!!‘,name) f = open(‘test1.txt‘,‘rb‘) date = pickle.loads(f.read()) print (date[‘func‘]) #输出内存地址 print(date[‘func‘](‘peter‘)) #调用hello函数,输出“hello,hello!!,peter”
由于之前函数被释放,重新定义相同函数名字的函数即可。
三、小技巧
1、简写方式
f.write(json.dumps(info)) json.loads(f.read())
以上代码可以简写为:
json.dump(info,f) json.load(f)
2、多次dump,一次load(3.0以上版本)
import json info = {‘age‘:22,‘name‘:‘peter‘,‘email‘:‘@qq.com‘} f = open(‘test.txt‘,‘w‘) json.dump(info,f) info[‘age‘]=‘33‘ json.dump(info,f) info[‘name‘]=‘Tom‘ json.dump(info,f)
结果会输出三个字典,此时通过json.load(f)就会出错!但是刻印通过for循环调用数据
疑问:1.pickle在处理函数时,具体是序列化整个函数,还是函数的内存地址