# 序列化模块
# 序列化 都是转向一个字符串数据类型的过程
# 序列 ---- 这里说的就是字符串
# 可以进行序列化的东西
# 数字、字符串、列表、字典、元组(元组的序列化其实是转换成列表后再去进行序列化的)
# 从数据类型 到 字符串的过程 就叫做序列化
# 从字符串 到 数据类型的过程 就叫做反序列化
# 序列化模块
# json 通用的序列化格式, 能被json序列化的数据类型是数字、字符串、字典
# 只有很少的一部分数据类型(数字、字符串、字典)能够通过josn换成字符串,
# dumps 序列化方法
# loads 反序列化方法
# pickle (应用的领域,例如游戏中,退出后,当再次登录时还是在上次的位置)
# 所有python中的数据类型都可以被序列化
# pickle序列化的内容只有python能理解
# 且部分反序列化依赖代码
# shelve python3中新出现的一种序列化方式
# 序列化句柄
# 使用句柄直接操作,非常方便
# json dumps 序列化方法
dic = {'k1':'v1'}
import json
str_d = json.dumps(dic) # 将字典进行序列化
print(type(str_d), str_d) # <class 'str'> {"k1": "v1"}
# json loads 反序列化方法
dic_d = json.loads(str_d) # 反序列化
print(type(dic_d), dic_d) # <class 'dict'> {'k1': 'v1'}
# json dump 一次性的序列化后写入文件
dic = {1 : '中国', 2:'b'}
f = open('fff', 'w', encoding='utf-8')
# ensure_ascii=False 使得在文件中的中国是中国
json.dump(dic, f, ensure_ascii=False) # 将字典序列化成字符串后,写入到了文件中
f.close()
# json load 一次性的读出后反序列化
f = open('fff', encoding='utf-8')
res = json.load(f) # 从文件中将字符串反序列化
f.close()
print(type(res), res) # <class 'dict'> {'2': 'b', '1': 'a'}
# pickle 所有python中的数据类型都可以被序列化
# 方法
# dumps
# loads
# dump
# load
import time
import pickle
# pickle dumps 序列化,变成了二进制数据
dic = {1:'v1', 'k2':'v2'}
str_dic = pickle.dumps(dic) # 将字典序列化,变成了二进制数据
print(str_dic) # b'\x80\x03}q\x00(K\x01X\x02\x00\x00\x00v1q\x01X\x02\x00\x00\x00k2q\x02X\x02\x00\x00\x00v2q\x03u.'
# pickle loads 反序列化,二进制数据变成数据类型
dic2 = pickle.loads(str_dic) # 将数据进行反序列化
print(dic2) # {1: 'v1', 'k2': 'v2'}
struct_time1 = time.localtime(1000000000)
struct_time2 = time.localtime(2000000000)
f = open('pickle_file', 'wb') # 因为pickle序列化后的是二进制bytes类型,所以要往文件写时,要以b打开,bytes打开
# pickle dump #
pickle.dump(struct_time1, f)
pickle.dump(struct_time2, f)
f.close()
# pickle load # load可以分次读出然后反序列化
f = open('pickle_file', 'rb')
struct_time1 = pickle.load(f)
struct_time2 = pickle.load(f)
print(struct_time1.tm_year) # 2001
print(struct_time2.tm_year) # 2033
f.close()
# shelve # 序列化写入文件时,他还会创建bak、dat、dir文件
# 这个模块有个限制,它不支持多个应用同一时间往同一个DB进行写操作。
# 所以当我们知道我们的应用如果只进行读操作,我们可以让shelve通过只读的方式打开DB
import shelve
f = shelve.open('shelve_file')
f['key'] = {'int': 10, 'float':9.0} # 直接对文件句柄进行操作,序列化操作写入文件,索引为'key'
f.close()
f1 = shelve.open('shelve_file')
existing = f1['key'] # 直接读取文件的'key'位置的序列化的内容,然后反序列化得到
f1.close()
print(existing) # {'int': 10, 'float': 9.0}