近日,需要用Python读取二进制文件(见上图),然后解析出想要的数据,转化成16进制,在显示出来
1. fp = open(path,'r+')
2.
3. s= fp.read(ioneblock)
4.
5.
6. while '' != s :
7.
8. 'hex')
9. print 'first t is %t'%t
遇到到一个莫名的问题,遇到'0x1A'的字节就会读不出来,费了差不多一天时间,发现Python会将这个字符认为是文档结束符EOF。
解决这个问题的方法就是,二进制文件就用二进制方法打开。
将 fp = open(path,'r+') 改为
fp = open(path,'rb')
问题得到解决
利用Python读取二进制文档时,如一些程序的计算结果,一般要在在打开文件后,利用struct模块中的unpack方法获取真实数据。
import os
import structfp=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上面的链接指出了这个问题,但是后面的解释并不十分合理