前言
文件只能存储字符串、二进制,若把内存的数据对象存到硬盘 从硬盘里读取数据,里面不止是字符串的类型,因此用到了json and pickle 序列化
json序列化
作用:用于不同语言进行的数据交互,json默认只能处理简单化的数据类型:字典、列表、字符串。为何只能处理简单的数据类型?因为java里的类和pyhton的类完全不一样,定义、特性等
文件只能存储字符串、二进制,例如将数据字典的数据类型写入文件,报错
按之前学过的知识对文件序列化
info = {
"name":"Mike",
"age":16
}
f = open("json1","w",encoding = "utf-8")
f.write(info)
f.close()
结果:
Traceback (most recent call last):
File "E:/python_3.5/second/json模块/json1.py", line 6, in <module>
f.write(info)
TypeError: write() argument must be str, not dict
数据类型为字符串已存入文件
info = {
"name":"Mike",
"age":16
}
f = open("json1","w",encoding = "utf-8")
f.write(str(info))
f.close()
写入的json1文件
{'age': 16, 'name': 'Mike'}
用json.dumps()序列化
import json
info = {
"name":"Mike",
"age":16
}
f = open("json1","w",encoding = "utf-8")
#print(json.dumps(info)) #结果{"age": 16, "name": "Mike"}
f.write(json.dumps(info)) 写入文件
{"age": 16, "name": "Mike"}
json.dump()序列化
不用写f.write() 将文件句柄传入
import json
info = {
"name":"Mike",
"age":16,
#"fun":sayhi
} f = open("json1","w",encoding = "utf-8”)
json.dump(info,f) 写入文件:
{"age": 16, "name": "Mike"}
json.loads()反序列化
按之前学过的知识对文件反序列化
f = open("json1","r",encoding = "utf-8")
data = eval(f.read())
print(data)
print(data["age"]) 结果:
{'age': 16, 'name': 'Mike'}
16
用json反序列化读取文件
import json
f = open("json1","r",encoding = "utf-8")
data = json.loads(f.read())
print(data["age"])
结果
16
json.load()反序列化
import json
f = open("json1","r")
# data = pickle.loads(f.read())
print(json.load(f)) 结果:
{'age': 16, 'name': 'Mike'}
pickle.dumps() 序列化
pickle只有在Python本语言里使用,java不认识pickle数据类型,只认识json数据类型
pickle可以序列化python里的所有数据类型
import pickle
def sayhi():
print("hello")
info = {
"name":"Mike",
"age":16,
"fun":sayhi
} f = open("json1","wb")
f.write(pickle.dumps(info))
写入的文件
注意:
pickle.loads() 反序列化
import pickle
def sayhi():
print("hello") #为何这里要再写一遍,在序列化时程序结束函数的内存地址已经被释放了 已找不到 f = open("json1","rb")
data = pickle.loads(f.read())
print(data["age"])
print(data)
结果:
16
{'name': 'Mike', 'fun': <function sayhi at 0x005D2FA8>, 'age': 16}