使用 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'\xc82\x00\x00\x00\x00`B\x01'
4 >>> len(_) 5 9
6 >>> struct.pack('if?',9999,5336.0,False) 7 b"\x0f'\x00\x00\x00\xc0\xa6E\x00"
8 >>> len(_) 9 9
10 >>>
11 >>> x = 'al@中国'
12 >>> len(x.encode()) 13 9
14 >>>