Чтение бинарного файла с использованием распаковки в Python по сравнению с методом IDL - PullRequest
0 голосов
/ 18 сентября 2018

У меня есть процедура IDL для чтения двоичного файла, и я пытаюсь перевести его в процедуру Python.Код IDL выглядит так:

a = uint(0)
b = float(0)
c = float(0)
d = float(0)
e = float(0)
x=dblarr(nptx)
y=dblarr(npty)
z=dblarr(nptz)
openr,11,name_file_data,/f77_unformatted
readu,11,a
readu,11,b,c,d,e
readu,11,x
readu,11,y
readu,11,z

, он отлично работает.Поэтому я пишу то же самое в Python, но я не могу найти те же результаты (даже значение «а» отличается).Вот мой код:

x=np.zeros(nptx,float)
y=np.zeros(npty,float)
z=np.zeros(nptz,float)
with open(name_file_data, "rb") as fb:
    a, = struct.unpack("I", fb.read(4))
    b,c,d,e = struct.unpack("ffff", fb.read(16))
    x[:] = struct.unpack(str(nptx)+"d", fb.read(nptx*8))[:]
    y[:] = struct.unpack(str(npty)+"d", fb.read(npty*8))[:]
    z[:] = struct.unpack(str(nptz)+"d", fb.read(nptz*8))[:]

Надеюсь, что это поможет кому-нибудь ответить мне.

Обновление: Как предлагается в ответах, я сейчас пробую модуль "FortranFile", но яЯ не уверен, что все понял о его использовании.

from scipy.io import FortranFile
f=FortranFile(name_file_data, 'r')
a=f.read_record('H')
b=f.read_record('f','f','f','f')

Однако вместо целого числа для 'a' я получил: array ([0, 0], dtype = uint16).

И у меня произошла следующая ошибка для 'b': полученный размер (1107201884) не кратен указанному dtypes (16)

1 Ответ

0 голосов
/ 18 сентября 2018

Согласно таблица типов данных IDL , UINT(0) создает 16-битное целое число (то есть два байта).В модуле Python struct символ формата I обозначает 4-байтовое целое число, а H обозначает 16-битное целое число без знака.

Попробуйтеизменение строки, которая распаковывает a на

    a, = struct.unpack("H", fb.read(2))

К сожалению, это, вероятно, не решит проблему.Вы используете опцию /f77_unformatted с openr, что означает, что файл содержит больше, чем просто необработанные байты переменных.(См. Документацию команды OPENR для получения дополнительной информации о /f77_unformatted.)

Вы можете попробовать использовать scipy.io.FortranFile для чтения файла, но тамнет никаких гарантий, что это будет работать.Бинарный макет неформатированного файла Фортрана зависит от компилятора.

...