序列化和反序列化
序列化是为了将内存中的数据保存在磁盘上或者用于传输,实现程序状态的保存和共享。反序列化反之。
序列化后的变量再被反序列化回来之后,两者之间已经没有任何关系。
序列化后的文件是在不同程序或者说不同语言之间传递数据的关键方法之一,可以将内容标准化为xml、json等格式,用于存储或者网络传输。
常用的序列化和反序列化方法:
python中常见序列化和反序列化模块cPickle和pickle。
python2中cPickle是用C语言编写的,效率较高,优先使用cpickle。但是python3中cPickle模块已经替换为_pickle模块。python3中引入使用import pickle即可,因为pickle模块已经经过重构和优化,建议在python3中使用pickle模块。
dumps方法:将任意对象序列化为一个str。然后可以将str写入文件中。
dump方法:将序列化对象直接写入文件中。
loads方法:把序列化后的文件读取的str反序列化为对象。
load方法:将文件直接反序列化为对象。
例子1:
import pickle
d = dict(url='https://www.baidu.com/',title='百度首页',content='百度首页内容')
serialized_d = pickle.dumps(d)
print(serialized_d)
deserialized_d=pickle.loads(serialized_d)
print(deserialized_d)
例子2:
import pickle
d = dict(url='https://www.baidu.com/',title='百度首页',content='百度首页内容')
serialized_d = pickle.dumps(d)
with open(r'd:\test\test20240802.txt','wb') as file_writer:
file_writer.write(serialized_d)
例子3:通过dump之间序列化为文件内容。
import pickle
d = dict(url='https://www.baidu.com/',title='百度首页',content='百度首页内容')
serialized_d = pickle.dumps(d)
# 把百度首页序列化到test20240802.txt文本文件中
with open(r'd:\test\test20240802.txt','wb') as file_writer:
file_writer.write(serialized_d)
serialized_d2 = pickle.dump(d,open(r'd:\test\test20240802b.txt','wb'))
例子4:用loads方法或者load方法将序列化文件内容反序列化。
import pickle
d = dict(url='https://www.baidu.com/',title='百度首页',content='百度首页内容')
serialized_d = pickle.dumps(d)
# 把百度首页序列化到test20240802.txt文本文件中
with open(r'd:\test\test20240802.txt','wb') as file_writer:
file_writer.write(serialized_d)
serialized_d2 = pickle.dump(d,open(r'd:\test\test20240802b.txt','wb'))
# loads方法将序列化后的文件内容读取为字符串,并且反序列化展示
with open(r'd:\test\test20240802.txt','rb') as file_reader:
v_file_reader = pickle.loads(file_reader.read())
print(v_file_reader)
# load方法直接将文件内容反序列化
v_file_reader2 = pickle.load(open(r'd:\test\test20240802b.txt','rb'))
print(v_file_reader2)