目录
(1)使用marshal模块读写二进制文件,并对对象进行序列化和反序列化操作
二进制文件
1.pickle模块
pickle.dump(obj, file[, protocol])
序列化对象,并将结果数据流写入到文件对象中。参数protocol是序列化模式,默认值为0,表示以文本的形式序列化。protocol的值还可以是1或2,表示以二进制的形式序列化。
pickle.load(file)
反序列化对象。将文件中的数据解析为一个Python对象。其中要注意的是,在load(file)的时候,要让python能够找到类的定义,否则会报错。
(1)使用pickle模块写入二进制文件
import pickle
i = 13000000
a = 77.056
s = '中国人民 123abc'
lst = [[1, 2, 3], [4, 5, 6], [7, 8, 7]]
tu = (-5, 10, 8)
coll = {4, 5, 6}
dic = {'a':'apple', 'b':'banana', 'g':'grape', 'o':'orange'}
data = (i, a, s, lst, tu, coll, dic)
with open('sample_pickle.dat', 'wb') as f:
pickle.dump(len(data), f) #要序列化的对象个数
for item in data:
pickle.dump(item, f) #序列化数据并写入文件
(2)使用pickle模块读取二进制文件
import pickle
with open('sample_pickle.dat', 'rb') as f:
n = pickle.load(f) #读出文件中的数据个数
for i in range(n):
x = pickle.load(f) #读取并反序列化每个数据
print(x)
2.struct模块
(1)使用struct模块写入二进制文件
import struct
n = 1300000000
x = 76.45
b = True
s = 'a1@中国'
sn = struct.pack('if?', n, x, b) #序列化,i表示整数,f表示实数,?表示逻辑值
with open('sample_struct.dat', 'wb') as f:
f.write(sn)
f.write(s.encode()) #字符串需要编码为字节串再写入文件
(2)使用struct模块读取二进制文件
import struct
with open('sample_struct.dat', 'rb') as f:
sn = f.read(7)
n, x, b1 = struct.unpack('if?', sn) #使用指定格式反序列化
print('n=',n, 'x=',x, 'b1=',b1)
s = f.read(7).decode()
print('s=', s)
3.shelve模块
(1)使用shelve模块写入二进制文件
import shelve
zhangsan = {'age':38, 'sex':'Male', 'address':'SDIBT'}
lisi = {'age':40, 'sex':'Male', 'qq':'1234567', 'tel':'7654321'}
with shelve.open('shelve_test.dat') as fp:
fp['zhangsan'] = zhangsan # 像操作字典一样把数据写入文件
fp['lisi'] = lisi
for i in range(5):
fp[str(i)] = str(i)
(2)使用shelve模块读取二进制文件
with shelve.open('shelve_test.dat') as fp:
print(fp['zhangsan']) #读取并显示文件内容
print(fp['zhangsan']['age'])
print(fp['lisi']['qq'])
print(fp['3'])
运行结果:
{'sex': 'Male', 'address': 'SDIBT', 'age': 38}
38
1234567
3
4.marshal模块
(1)使用marshal模块读写二进制文件,并对对象进行序列化和反序列化操作
import marshal #导入模块
x1 = 30 #待序列化的对象
x2 = 5.0
x3 = [1, 2, 3]
x4 = (4, 5, 6)
x5 = {'a':1, 'b':2, 'c':3}
x6 = {7, 8, 7}
x = [eval('x'+str(i)) for i in range(1,7)] #把所有数据放入列表
x
[30, 5.0, [1, 2, 3], (4, 5, 6), {'a': 1, 'b': 2, 'c': 3}, {8, 7, 7}]
with open('test.dat', 'wb') as fp: #创建二进制文件
marshal.dump(len(x), fp) #先写入对象个数
for item in x:
marshal.dump(item,fp) #把列表中的对象依次序列化并写入文件
with open('test.dat', 'rb') as fp: #打开二进制文件
n = marshal.load(fp) #获取对象个数
for i in range(n):
print(marshal.load(fp)) #反序列化,输出结果
运行结果:
30
5.0
[1, 2, 3]
(4, 5, 6)
{'a': 1, 'b': 2, 'c': 3}
{8, 7, 7}