day5-json & pickle序列化
概述
首先我们写入文件和读取文件的一般方法:
info={"name":"dick","age":22,"sex":"M"} f=open("info","w") f.write(str(info)) #将字典信息info写入文件 #写入到文件info.txt的内容 {"name":"dick","age":22,"sex":"M"} f1=open("name","r") x=f1.read() dict_name=eval(x) print(dict_name["sex"]) #输出 "M"
从上面的例子可以看出,我们在写入文件中的数据,只能是字符串,但是如果要想把内存的数据对象写入到硬盘上怎么办呢?下面就来说说序列化:json & pickle,主要用于不同语言之间的数据交互。
json序列化
1.dumps序列化和loads反序列化
用法:对内容进行序列化,使用dumps和loads
序列化(dumps)
用法:json.dumps()函数(它表示“dump string”,而不是“dumps”)将一个Python 值转换成JSON 格式的数据字符串。在交互式环境中输入以下代码:
import json #导入模块 info={"name":"dick","age":22,"sex":"M"} f=open("info.txt","w") print(json.dumps(info),type(json.dumps(info))) f.write((json.dumps(info))) f.close() #写入到文件info.txt的内容 {"name": "dick", "sex": "M", "age": 22} <class 'str'> #将字典信息info以字符串形式写入文件
注意:该值只能是以下基本Python 数据类型之一:字典、列表、整型、浮点型、字符串、布尔型或None。
反序列化(loads)
用法:要将包含JSON 数据的字符串转换为Python 的值,就将它传递给json.loads()函数(这个名字的意思是“load string”,而不是“loads”)。在交互式环境中输入以下代码:
import json #导入模块 info={"name":"dick","age":22,"sex":"M"} f1=open("test","r") data=json.loads(f1.read()) print(data["age"]) f.close() #输出 22
解析:导入json 模块后,就可以调用loads(),向它传入一个JSON 数据字符串。请注意,JSON 字符串总是用双引号。它将该数据返回为一个Python 字典。
2.dump序列化和load反序列化
用法:对文件对象进行序列化,使用dump和load
序列化(dump)
#导入模块 import json # 写入 JSON 数据 info={"name":"dick","age":22,"sex":"M"} with open('test', 'w') as f: #文件以写的方式打开 json.dump(info, f) #第1个参数是内存的数据对象 ,第2个参数是文件句柄 #写入到文件test.txt的内容 {"name":"dick","age":22,"sex":"M"}
反序列化(load)
#导入模块 import json # 读取数据 with open('test', 'r') as f: #以读的方式打开 data = json.load(f) #输入文件对象 print(data.get("name")) #输出 dick
pickle序列化
1.dumps序列化和loads反序列化
用法:对文件对象进行序列化,使用dumps和loads
序列化(dumps)
import pickle info={"name":"dick","age":22,"sex":"M"} f1=open("test","wb") #以二进制写入 f1.write(pickle.dumps(info)) f.close() #输出到test.txt文件中的内容
反序列化(loads)
import pickle f1=open("test","rb") #以二进制读取 data=pickle.loads(f1.read()) print(data) f.close() #输出 {'age': 22, 'sex': 'M', 'name': 'dick'}
2.dump序列化和load反序列化
序列化(dump)
import pickle info={"name":"dick","age":22,"sex":"M"} with open('test', 'wb') as f: pickle.dump(info, f) #输出到文件
反序列化(load)
with open('test', 'rb') as f: data = pickle.load(f) #反序列化内存对象 print(data.get["sex"]) #输出 M
3.序列化函数
序列化(dumps)
import pickle def sayhi(): print("hello world!") #序列化 info={"name":"dick","age":22,"sex":"M","func":sayhi} f1=open("name","wb") f1.write(pickle.dumps(info)) #与pickle.dump(info,f)相同效果 f.close()
反序列化(loads)
#反序列化 def sayhi(name): print("hello world!",name) f1=open("name","rb") #以二进制读取 data=pickle.loads(f1.read()) #与data=pickle.load(f)相同效果 print(data["age"]) f.close() #输出 22
小结
- pickle能够将整个函数进行序列化,但是pickle只能支持在Python本语言里面能用,java是不认识的,java只认识json
- 使用json时,dump一次load一次,可以dump n次,但是只能load 1次,所以,想要存写入新的字符,最好每次dump到不同的文件,就像虚机快照一样,其实存到不同的文件