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

  使用 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 >>> 
原文地址:https://www.cnblogs.com/avention/p/8779270.html