Как извлечь двоичный файл ieee-be, встроенный в zipfile? - PullRequest
0 голосов
/ 27 октября 2009

У меня есть набор 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

первый всплеск в моем двоичном файле

  • HEX значение: BD 98 99 3D
  • float: -.07451103

Ответы [ 3 ]

2 голосов
/ 27 октября 2009

Большая часть того, что вам нужно, в этом ответе Как мне преобразовать число с плавающей точкой Python в шестнадцатеричную строку в Python 2.5? Нерабочий раствор прилагается

Смотрите материал о struct.pack.

Более подробная информация о структуре находится в Документах Python

1 голос
/ 27 октября 2009

Вы также можете попробовать расширение Numpy ( здесь ), которое немного легче, чем SciPy. Numpy имеет много процедур ввода-вывода. Например,

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

дает вам массив. Вероятно, есть менее простой способ указать тип данных.

1 голос
/ 27 октября 2009

В фрагменте вопроса «файлы свойств» (что бы это ни было) довольно свободно обнаруживаются по наличию строки «свойства» в их содержимом при чтении в виде текста. Я не знаю, что эквивалентно этому для двоичных файлов IEEE-le.

Однако в Python простой способ чтения файлов ieee-le (или других форматов) - с помощью модуля io.fopen SciPy.

Редактировать
Поскольку в любом случае для чтения такого двоичного файла требуется знать структуру, вы можете выразить это в формате struct.pack (), как описано в ответе Майкла Диллона! Для этого требуется только библиотека std, и это так же просто!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...