序列化模块_pickle

序列化:

把不能够直接存储的数据变成字节流(bytes)保存在文件,
进行持久化存储

反序列化:

把存储的数据(bytes)转化成原本的数据类型,

任何数据都可以转成字节流(bytes)进行存储

只有str有encode, decode
其他类型数据需要pickle

1. dumps

把任意对象序列化

li = [1, 2, 4]
res = pickle.dumps(li)

# 返回bytes
print(res, type(res))

2. loads

把字节流转换为原本的数据

li1 = pickle.loads(res)

# 转换回的数据类型为list
print(li1, type(li1))

3. dump(obj, f)

将数据写入文件

with open('1.txt', 'wb') as f:
   li = [1, 2, 4, 5]

   # 将li转换成bytes, 使用f句柄写入文件, 没有返回值
   pickle.dump(li, f)

4. load(f)

读取写入文件中的字节流数据, 并将其转换成原本的数据

with open('1.txt', 'rb') as f:
   res = pickle.load(f)

   # 读取f中写入的数据对象, 将bytes转换成原本的数据类型
   print(res, type(res))

序列化迭代器

iter1 = iter(range(5))
res = pickle.dumps(iter1)

iter2 = pickle.loads(res)
print(iter2, type(iter2))

多数据对象使用pickle写入文件

li = [1, 2, 4, 5]
tup = (1, 2, 4, 5)
dic = {1:2, 2:3, 4:3}
s = 'abc'
setvar = {1, 2, 4}

with open('2.txt', 'wb') as f:
   pickle.dump(li, f)
   pickle.dump(tup, f)
   pickle.dump(setvar, f)
   pickle.dump(dic, f)
   pickle.dump(s, f)


with open('2.txt', 'rb') as f:
   # f也是一个迭代器,
   # load相当于next, 不断调用f
   # 返回反序列化后的数据
   for i in range(5):
      res = pickle.load(f)
      print(res, type(res))

你可能感兴趣的:(序列化模块_pickle)