Python读二进制文件遇到的问题

 

近日,需要用Python读取二进制文件(见上图),然后解析出想要的数据,转化成16进制,在显示出来

 

   

 

遇到到一个莫名的问题,遇到'0x1A'的字节就会读不出来,费了差不多一天时间,发现Python会将这个字符认为是文档结束符EOF。

 

 

 解决这个问题的方法就是,二进制文件就用二进制方法打开。

将 fp = open(path,'r+') 改为

fp = open(path,'rb')

问题得到解决

 

 

以下是转载内容

利用Python读取二进制文档时,如一些程序的计算结果,一般要在在打开文件后,利用struct模块中的unpack方法获取真实数据。

import os
import struct

fp=open(filename,"r")
data = struct.unpack("f",fp.read(4))

这几行语句实现了从文件中读取4个字节数据并转化为float数。
一般这样执行时没有问题的,fp.read(4)返回的是4个字节对应的字符,unpack将这4个字符按照float格式进行翻译。

但是,在数据处理中发现,如果一个数据的第一个字节是"/x1A",那么Python就会将这个字符认为是文档结束符EOF,从而不再读取后面三个数据,譬如
在二进制文件中存在如下从低位向高位排列的数据
1A 2F 3D 10 2C 12 2E 76
那么第一次读4个字节时,会读不出任何数据。加入这次读取数据仍然能够完成,那么接下来读取的下4个字节数据就是2F 3D 10 2C了,从而会导致数据出现根本错误。

解决这个问题的方法就是,二进制文件就用二进制方法打开。

fp=open(filename,"r")
修改为
fp=open(filename,"rb")
上面的错误就不会发生了。
第一次读取4个字节时,是按照二进制位进行读取的,fp.read(4)只是返回32位数据,而不会将其翻译成对应的字符,从而避免了上面的错误。

 

 

http://mail.python.org/pipermail/python-bugs-list/2004-February/022213.html
上面的链接指出了这个问题,但是后面的解释并不十分合理
http://hi.baidu.com/azhw/blog/item/4b5d6609c350f9cc3bc763b7.html
这个blog中的解决办法会浪费很多计算机资源。


 

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页