6.3.2 使用struct模块读写二进制文件

时间:2021-08-31 05:32:24

  使用 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 >>>