Python序列化和反序列化Json、Pickle
Python用于序列化的两个模块
- json: 可用在不同语言之间交换数据,Python中用于字符串和python数据类型间进行转换。
- pickle:只用于python特有的类型和python的数据类型间进行转换。
json模块四个方法:dumps、dump、loads、load
json.dumps(): 对json进行序列化,把数据类型转换成字符串。
json.dump():对json进行序列化, 把数据类型转换成字符串,并存储在文件中。
json.loads(): 进行反序列化,把字符串转换成数据类型 。
json.load(): 把文件打开并进行反序列化,从字符串转换成数据类型。
import json
dict1 = {"张三": 14, "李四": 15, "王五": 16}
dict2 = json.dumps(dict1)
print(dict2)
#结果:'{"\u5f20\u4e09": 14, "\u674e\u56db": 15, "\u738b\u4e94": 16}'
dict3 = json.loads(dict2)
print(dict3)
#结果:{'张三': 14, '李四': 15, '王五': 16}
with open('../test', 'w', encoding='utf8') as file:
json.dump(dict1, file)
#结果在父级目录下的test中写入:'{"\u5f20\u4e09": 14, "\u674e\u56db": 15, "\u738b\u4e94": 16}'
with open('../test', 'r', encoding='utf8') as file2:
dict4 = json.load(file2)
print(dict4)
#结果:{'张三': 14, '李四': 15, '王五': 16}
pickle模块四个方法:dumps、dump、loads、load
pickle.dumps(): 对对象进行序列化,把对象转换成字节型。
pickle.dump():对对象进行序列化, 把对象转换成字节型,并存储在文件中。
pickle.loads(): 进行反序列化,把字节型转换成对象本身 。
pickle.load(): 把文件打开并进行反序列化,从字节型转换对象本身。
import pickle
dict1 = {"张三": 14, "李四": 15, "王五": 16}
dict2 = pickle.dumps(dict1)
print(dict2)
#结果:b'\x80\x04\x95&\x00\x00\x00\x00\x00\x00\x00}\x94(\x8c\x06\xe5\xbc\xa0\xe4\xb8\x89\x94K\x0e\x8c\x06\xe6\x9d\x8e\xe5\x9b\x9b\x94K\x0f\x8c\x06\xe7\x8e\x8b\xe4\xba\x94\x94K\x10u.'
print(type(dict2))
#结果:<class 'bytes'>
dict3 = pickle.loads(dict2)
print(dict3)
#结果:{'张三': 14, '李四': 15, '王五': 16}
with open(r'../test.txt', 'wb') as file:
pickle.dump(dict1, file)
with open('../test', 'rb') as file2:
dict4 = pickle.load(file2)
print(dict4)
#结果:{'张三': 14, '李四': 15, '王五': 16}
拓展
- json是可以在不同语言之间交换数据的,pickle只在python之间使用
- json只能序列化最基本的数据类型,josn只能把常用的数据类型序列化(列表、字典、列表、字符串、数字等),比如日期格式、类对象等对象时json就不行了
- pickle可以序列化所有的数据类型,包括类,函数都可以序列化。