Python中的pickle和json模块
2019-08-29 本文已影响0人
NJingZYuan
dumps => 卸出,从内存中导出,把数据从内存中变成可存储或可传输的,序列化 => 将Python数据转换为另一种格式的数据
loads => 加载,将数据加载至内存,把序列化后的数据重新读到内存里,反序列化 => 将其他格式的数据转换为Python数据
pickle和json模块
序列化和反序列化是对同一数据在不同格式间的来回转换。
python提供的模块 pickle
和json
可以实现序列化和反序列化。
pickle
0. 导入模块
import pickle
1. pickle - dumps - 序列化
pickle.dumps()
方法能把任意数据对象序列化成一个bytes
格式,之后可以写入文件中
pickle.dumps(数据对象)
示例:
>>> import pickle
>>> d = dict(name='Bob', age=20, score=88)
>>> pickle.dumps(d)
b'\x80\x03}q\x00(X\x03\x00\x00\x00ageq\x01K\x14X\x05\x00\x00\x00scoreq\x02KXX\x04\x00\x00\x00nameq\x03X\x03\x00\x00\x00Bobq\x04u.'
2.pickle - dump - 序列化
pickle.dump()
能够直接把任意数据对象序列化后写入file-like object:
示例:
# 把数据d序列化后写入文件dump.txt中
>>> f = open('dump.txt', 'wb')
>>> pickle.dump(d, f)
>>> f.close()
3. pickle - loads - 反序列化
pickle.loads()
方法能把pickle.dumps()序列化后的数据反序列化回来
>>> d = b'\x80\x03}q\x00(X\x03\x00\x00\x00ageq\x01K\x14X\x05\x00\x00\x00scoreq\x02KXX\x04\x00\x00\x00nameq\x03X\x03\x00\x00\x00Bobq\x04u.'
>>> pickle.dumps(d)
{'name'='Bob', 'age'=20, 'score'=88}
4. pickle - load - 反序列化
pickle.load()
方法能直接把pickle.dumps()序列化后保存在文件中的数据反序列化回来
>>> f = open('dump.txt', 'rb')
>>> d = pickle.load(f) # 能够直接反序列化文件中的序列化数据
>>> f.close()
>>> d
{'age': 20, 'score': 88, 'name': 'Bob'}
json
0. 导入模块
import json
1. json - dumps - 序列化为json字符串
json.dumps()
方法能够把Python数据序列化为 json字符串 :
import json
d = {"name": jane, "score": 88}
b = json.dumps(d)
# 返回json字符串
>>> b = '{"name": jane, "score": 88}'
2. json - dump - 直接写入json字符串至文件
json.dump()
方法可以直接把序列化后的JSON字符串写入一个file-like Object
:
import json
d = {"name": jane, "score": 88}
f = open('json.txt', 'w')
json.dump(d, f) # 将d序列化成json字符串后,写入json.txt
f.close()
3. json - loads - 将json字符串反序列化
json.loads()
方法可以将一个json字符串数据反序列化成为Python标准数据:
import json
b = '{"name": jane, "score": 88}'
d = json.loads(b)
# 返回python类型数据
>>> d = {"name": jane, "score": 88}
4. json - load - 从文件中读取json字符串
json.load()
方法可以直接从一个写有json字符串的文件中读出json字符串并反序列化为python数据:
import json
f = open('json.txt', 'r')
d = json.load(f) # 直接读取f中的json字符串并反序列化
>>> d = {"name": jane, "score": 88}
Json进阶 - 序列化类的实例对象为json字符串
-
将类对象进行序列化,转换为json字符串:
import json
class Student(object):
def __init__(self, name, score):
self.name = name
self.score = score
# 将Student实例转换为dict对象函数
def student2dict(stu):
return {
'name': stu.name,
'score': stu.score
}
stu = Student('David', 88)
d = json.dumps(stu, default=student2dict)
过程:student2dict函数先将stu对象转换为python字典 => json.dumps()将python字典序列化为json字符串
-
将json字典,反序列化为类的实例对象
import json
class Student(object):
def __init__(self, name, score):
self.name = name
self.score = score
# 将Student实例转换为dict对象函数
def dict2student(stu_dict):
return Student(stu_dict['name'], stu_dict['score'])
stu_json = '{"name": "Bob", "score": 98}'
d = json.loads(stu_json, object_hook=dict2student)
过程:json.loads()先将stu_json反序列化为python字典 => dict2student函数根据python字典实例化对象