如何提取嵌入在zip文件中的ieee-be二进制文件?

时间:2009-10-26 21:13:17

标签: python

我有一组zip文件,其中包含几个ieee-be编码的二进制文件和文本文件。我使用了Pythons ZipFile模块,可以提取文本文件的内容

def readPropFile(myZipFile):
    zf = zipfile.ZipFile(myZipFile,'r') # Open zip file for reading
    zFileList=zf.namelist() # extract list of files embedded in _myZipFile_

    # text files in _myZipFile_ contain the word 'properties' so 
    # get a list of the property files here
    for f in zFileList:
        if f.find('properties')>0:
            propFileList.append(f)

    # open first file in propFileList
    pp2 = cStringIO.StringIO(zf.read(propFileList[0])) 
    fileLines = []
    for ll in pp2:
        fileLines.append(ll)

    # return the lines in the property text file
    return fileLines 

现在我想做同样的事情,除了读取二进制文件中的数据并创建一个浮点数组。那我该怎么办?

更新1

二进制文件的格式是这样的,在MATLAB I中将它们提取到临时位置之后我可以用以下内容读取它们

>>fid=fopen('dataFile.bin','r','ieee-be');
>>dat=fread(fid,[1 inf],'float');

更新2

我现在有一个简单的函数来尝试读取类似

的二进制数据
def readBinaryFile(myZipFile):
    zFile = zipfile.ZipFile(myZipFile,'r')
    dataFileName = 'dataFile.bin'
    stringData = zFile.read(dataFileName)
    ss=stringData[0:4]
    data=struct.unpack('>f',ss) 

但是我获得的值与MATLAB中报告的值相同。

更新3

首先浮动我的二进制文件

  • 十六进制值:BD 98 99 3D
  • float:-.07451103

3 个答案:

答案 0 :(得分:2)

您需要的大部分内容都在这个答案中How do I convert a Python float to a hexadecimal string in python 2.5? Nonworking solution attached

查看有关struct.pack的内容。

关于struct的更多细节在Python docs

答案 1 :(得分:1)

在问题的片段中,“属性文件”(无论是什么)以相当宽松的方式检测到,当它们作为文本读取时,其内容中存在字符串“属性”。我不知道对于二进制IEEE文件来说,这相当于什么。

但是,使用Python,使用SciPy's io.fopen模块读取ieee-le(或其他格式)文件的简便方法。

修改
因为无论如何阅读这样的二进制文件需要知道结构,你可以用一个struct.pack()格式来表达它,如Michael Dillon的回应所描述的那样!这只需要std库,就像这一样简单!

答案 2 :(得分:1)

您还可以尝试Numpy扩展程序(here),它比SciPy轻一点。 Numpy有很多I / O例程。例如,

import numpy
f = file ('example.dat')
data_type = numpy.dtype ('float32').newbyteorder ('>')
x = numpy.fromfile (f, dtype=data_type)

给你一个numpy数组。指定数据类型的方法可能不那么笨重。