json and pickle 序列化

前言

文件只能存储字符串、二进制,若把内存的数据对象存到硬盘   从硬盘里读取数据,里面不止是字符串的类型,因此用到了json and pickle 序列化

json序列化

作用:用于不同语言进行的数据交互,json默认只能处理简单化的数据类型:字典、列表、字符串。为何只能处理简单的数据类型?因为java里的类和pyhton的类完全不一样,定义、特性等

文件只能存储字符串、二进制,例如将数据字典的数据类型写入文件,报错

按之前学过的知识对文件序列化

 1 info = {
 2     "name":"Mike",
 3     "age":16
 4 }
 5 f = open("json1","w",encoding = "utf-8")
 6 f.write(info)
 7 f.close()
 8 结果:
 9 Traceback (most recent call last):
10   File "E:/python_3.5/second/json模块/json1.py", line 6, in <module>
11     f.write(info)
12 TypeError: write() argument must be str, not dict

数据类型为字符串已存入文件

1 info = {
2     "name":"Mike",
3     "age":16
4 }
5 f = open("json1","w",encoding = "utf-8")
6 f.write(str(info))
7 f.close()
8 写入的json1文件
9 {'age': 16, 'name': 'Mike'}

用json.dumps()序列化

 1 import json
 2 info = {
 3     "name":"Mike",
 4     "age":16
 5 }
 6 f = open("json1","w",encoding = "utf-8")
 7 #print(json.dumps(info))  #结果{"age": 16, "name": "Mike"}
 8 f.write(json.dumps(info))
 9 
10 写入文件
11 {"age": 16, "name": "Mike"}

 json.dump()序列化

不用写f.write()  将文件句柄传入

 1 import json
 2 info = {
 3     "name":"Mike",
 4     "age":16,
 5     #"fun":sayhi
 6 }
 7 
 8 f = open("json1","w",encoding = "utf-8”)
 9 json.dump(info,f)
10 
11 写入文件:
12 {"age": 16, "name": "Mike"}

json.loads()反序列化

按之前学过的知识对文件反序列化

1 f = open("json1","r",encoding = "utf-8")
2 data = eval(f.read())
3 print(data)
4 print(data["age"])
5 
6 结果:
7 {'age': 16, 'name': 'Mike'}
8 16

用json反序列化读取文件

1 import json
2 f = open("json1","r",encoding = "utf-8")
3 data = json.loads(f.read())
4 print(data["age"])
5 结果
6 16

json.load()反序列化

1 import json
2 f = open("json1","r")
3 # data = pickle.loads(f.read())
4 print(json.load(f))
5 
6 结果:
7 {'age': 16, 'name': 'Mike'}

 

pickle.dumps() 序列化

pickle只有在Python本语言里使用,java不认识pickle数据类型,只认识json数据类型

pickle可以序列化python里的所有数据类型

 1 import pickle
 2 def sayhi():
 3     print("hello")
 4 info = {
 5     "name":"Mike",
 6     "age":16,
 7     "fun":sayhi
 8 }
 9 
10 f = open("json1","wb")
11 f.write(pickle.dumps(info))

写入的文件

注意:

pickle.loads() 反序列化

 1 import pickle
 2 def sayhi():
 3     print("hello") #为何这里要再写一遍,在序列化时程序结束函数的内存地址已经被释放了 已找不到
 4 
 5 f = open("json1","rb")
 6 data = pickle.loads(f.read())
 7 print(data["age"])
 8 print(data)
 9 结果:
10 16
11 {'name': 'Mike', 'fun': <function sayhi at 0x005D2FA8>, 'age': 16}
原文地址:https://www.cnblogs.com/wengxq/p/6986736.html