我需要在Python中读取一个二进制文件。这个文件最初是由Fortran 90程序以如下方式编写的:
open(unit=10,file=filename,form='unformatted')
write(10)table%n1,table%n2
write(10)table%nH
write(10)table%T2
write(10)table%cool
write(10)table%heat
write(10)table%cool_com
write(10)table%heat_com
write(10)table%metal
write(10)table%cool_prime
write(10)table%heat_prime
write(10)table%cool_com_prime
write(10)table%heat_com_prime
write(10)table%metal_prime
write(10)table%mu
if (if_species_abundances) write(10)table%n_spec
close(10)
我可以用以下IDL代码轻松读取这个二进制文件:
n1=161L
n2=101L
openr,1,file,/f77_unformatted
readu,1,n1,n2
print,n1,n2
spec=dblarr(n1,n2,6)
metal=dblarr(n1,n2)
cool=dblarr(n1,n2)
heat=dblarr(n1,n2)
metal_prime=dblarr(n1,n2)
cool_prime=dblarr(n1,n2)
heat_prime=dblarr(n1,n2)
mu =dblarr(n1,n2)
n =dblarr(n1)
T =dblarr(n2)
Teq =dblarr(n1)
readu,1,n
readu,1,T
readu,1,Teq
readu,1,cool
readu,1,heat
readu,1,metal
readu,1,cool_prime
readu,1,heat_prime
readu,1,metal_prime
readu,1,mu
readu,1,spec
print,spec
close,1
我想做的是用Python读取这个二进制文件。但是有些问题。 首先,这是我读取文件的尝试:
import numpy
from numpy import *
import struct
file='name_of_my_file'
with open(file,mode='rb') as lines:
c=lines.read()
我尝试读取前两个变量:
dummy, n1, n2, dummy = struct.unpack('iiii',c[:16])
但是您可以看到,我不得不添加虚拟变量,因为一些Fortran程序在这些位置上添加了整数8。
现在的问题是尝试读取其他字节时,我没有得到与IDL程序相同的结果。
这是我尝试读取数组n的方法:
double = 8
end = 16+n1*double
nH = struct.unpack('d'*n1,c[16:end])
然而,当我打印这个数组时,我得到了无意义的值。我的意思是,我可以用上面的IDL代码读取文件,所以我知道该期望什么。那么我的问题是:在不知道确切结构的情况下,如何读取此文件?为什么使用IDL可以如此简单地读取它?我需要使用Python读取此数据集。