使用 struct 模块需要使用 pack() 方法吧对象按指定个数进行序列化,然后使用文件对象的write方法将序列化的结果写入二进制文件;读取时需要使用文件对象的read()方法读取二进制文件内容,然后再使用struct模块的unpack()方法反序列化得到原来的信息。
使用 struct 模块写入二进制文件。
1 #导入模块
2 import struct
3
4 #准备需要序列化的数据
5 n = 1300000000
6 x = 96.45
7 b = True
8 s = 'al@中国'
9 sn = struct.pack('if?',n,x,b) #序列化,i表示整数,f表示实数,?表示逻辑值
10 f = open('sample_struct.dat','wb')
11 f.write(sn) #将序列化后的对象写入文件
12 f.write(s.encode()) #字符串需要编码为字节串再写入文件
13 f.close()
14
15 #使用struct模块读取上例中写入的二进制文件内容。
16 f = open('sample_struct.dat','rb')
17 sn = f.read(9)
18 tu = struct.unpack('if?',sn)
19 print(tu) #(1300000000, 96.44999694824219, True) 浮点数,python中保存的是不准确的
20
21 s = f.read(9)
22 s = s.decode() #字符串解码
23 print(s) #al@中国
小提示:在上面的代码中,可能读者会疑惑如何确定要读取几个字节,为什么是 9 而不是其他数字呢?看完下面的代码应该能明白了。
1 >>> import struct
2 >>> struct.pack('if?',13000,56.0,True)
3 b'xc82x00x00x00x00`Bx01'
4 >>> len(_)
5 9
6 >>> struct.pack('if?',9999,5336.0,False)
7 b"x0f'x00x00x00xc0xa6Ex00"
8 >>> len(_)
9 9
10 >>>
11 >>> x = 'al@中国'
12 >>> len(x.encode())
13 9
14 >>>