zoukankan      html  css  js  c++  java
  • 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 >>> 
  • 相关阅读:
    getpass模块和random模块
    【转】Monkeyrunner测试1——Monkeyrunner的使用
    adb uninstall卸载apk 命令后跟的是包的名称
    【转】Android应用程序的数据存放目录解说
    【转】adb uninstall卸载apk文件说明
    【转】野兽成长史:张颖搭手傅盛在2008
    傅盛
    【转】傅盛:怎样做一个创业公司CEO?
    【转】搜狗测试经理分享
    性能测试积累
  • 原文地址:https://www.cnblogs.com/avention/p/8779270.html
Copyright © 2011-2022 走看看