对于二进制文件,不能使用记事本或其他文本编辑软件进行正常读写,也无法通过Python的文件对象直接读取和理解二进制文件的内容。必须正确理解二进制文件结构和序列化规则,才能准确地理解二进制文件内容并且设计正确的反序列化规则。
所谓序列化,简单地说就是把内存中的数据在不丢失其类型信息的情况下转成对象的二进制形式的过程,对象序列化后的形式经过正确的反序列化过程应该能够准确无误地恢复为原来的对象。
Python中常用的序列化模块有struct、pickle、marshal和shelve,本文主要介绍pickle模块的用法。
import pickle
# 要序列化的数据
i = 13000000
a = 99.056
s = '中国人民123abc'
lst = [[1, 2, 3], [4, 5, 6]]
tu = (-5, 10, 8)
coll = {4, 5, 6}
dic = {'a':'apple', 'b':'banana'}
# 把要序列化的数据放入一个列表
data = [i, a, s, lst, tu, coll, dic]
# 创建二进制文件并写入序列化后的数据
with open('sample_pickle.dat', 'wb') as f:
try:
# 后面将要写入的数据个数
pickle.dump(len(data), f)
for item in data:
pickle.dump(item, f)
except:
# 如果写文件异常则跳到此处执行
print('写文件异常!')
with open('sample_pickle.dat', 'rb') as f:
# 首先读取数据个数
n = pickle.load(f)
# 依次读取并反序列化数据
for i in range(n):
x = pickle.load(f)
print(x)