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到不同的文件,就像虚机快照一样,其实存到不同的文件

浙公网安备 33010602011771号