pickle库
程序在运行的过程中,会在内存中存储很多的数据。这些数据会随着程序的结束而被释放掉。那如果我们希望下一次程序启动起来之后,依然能够使用到这些内存中的数据该怎么办呢?我们就需要将内存中的数据以文件的形式保存下来,下一次程序启动的时候,可以直接读取这个文件中的数据,加载到内存中继续使用。
在这里需要涉及到两个概念:
- **序列化:**就是将内存中的对象,转成字节序列的形式。然后可以将这些字节序列保存到文件中,或者传递给网络中的其他的机器。
- **反序列化:**就是通过一个字节序列,将其中的数据读取到内存中。
而pickle库,就是来实现序列化和反序列化的操作的!
import pickle
# pickle库是一个用来将内存中的数据转成字节序列,存储到文件中的库,通常以.pkl为后缀
# 序列化:将内存中的数据,转成字节序列
# 反序列化:将字节序列的数据解析成内存中的数据
# 序列化:dump
# 反序列化:load
with open("./file/data.pkl", "wb") as write_stream:
pickle.dump(10, write_stream)
pickle.dump("10", write_stream)
pickle.dump(b"10", write_stream)
pickle.dump([10, 20], write_stream)
pickle.dump({"key": "value"}, write_stream)
with open("./file/data.pkl", "rb") as read_stream:
value1 = pickle.load(read_stream)
value2 = pickle.load(read_stream)
value3 = pickle.load(read_stream)
value4 = pickle.load(read_stream)
value5 = pickle.load(read_stream)
print(type(value1), value1)
print(type(value2), value2)
print(type(value3), value3)
print(type(value4), value4)
print(type(value5), value5)
注意事项:
在使用dump和load进行序列化和反序列化的时候,需要保证dump的次数和load的次数、顺序是相同的。
使用dump在序列化对象的时候,操作的个数是不确定的,会导致load的次数也就不确定了。
- 如果load次数少了,会导致数据没有完全读取。
- 如果load次数多了,会出现异常
那么如何解决这样的问题呢?
最简单也是最常见的解决方式就是:将需要序列化的所有的对象存储到一个数据容器中,将这个数据容器序列化就可以了。