【发布时间】:2016-05-06 17:53:23
【问题描述】:
我有一个二进制文件要读入 Python。该文件由三部分组成:波数列表、温度列表和作为温度和压力函数的不透明度列表。我想将前两个作为向量 a 和 b 导入,第三个作为二维数组 c 导入,这样 c[x,y] 对应于 a[x] 和 b[y]。
现有的 FORTRAN90 代码能够实现这一点,如下所示:
integer nS, nT
parameter (nS = 3000)
parameter (nT = 9)
real(8) wn_arr(nS) ! wavenumber [cm^-1]
real(8) temp_arr(nT) ! temperature [K]
real(8) abs_arr(nS,nT) ! absorption coefficient [cm^-1 / amagat^2]
open(33,file=trim(datadir)//'CO2_dimer_data',form='unformatted')
read(33) wn_arr
read(33) temp_arr
read(33) abs_arr
close(33)
我尝试了以下 python 代码:
f=scipy.io.FortranFile('file', 'r')
a_ref=f.read_reals(np.float64) #wavenumber (cm**-1)
b=f.read_reals(np.float64) #temperature (K)
c=f.read_reals(np.float64).reshape((3000,9))
但是,这会产生不正确的结果。我怀疑这是因为 Fortran 将数组写入文件的顺序与 Python 不同。但是,简单地将 order='F' 添加到 reshape 命令是行不通的。我怀疑这是因为在读入时, abscoeff_ref 已经变平了。
有什么想法吗?
【问题讨论】:
-
Fortran 无格式文件是可移植性的噩梦。通常,只有在同一硬件上使用同一编译器读/写时,您才能期望它们能够工作(因为记录分隔符未标准化)。看起来
scipy.io.FortanFile假设记录是在x86_64架构上使用gfortran编写的。那是您正在使用的编译器/架构吗? -
答案取决于您需要多长时间阅读此文件以及整个系统的便携性。正如 mgilson 已经说过的,您最大的问题是,该文件是未格式化的 SEQUENTIAL 格式,它不仅存储数据,而且还存储每个记录周围的开始记录和结束记录标记(=大致每个写入变量),其大小取决于编译器。如果你只是想读取文件而不关心可移植性,可以尝试自己编写解析代码。我对 scipy.io.FortranFile 方法没有经验,但它的选项似乎有限,如果它不起作用......
-
如果没有文件,很难帮助您编写代码,但我已经使用 numpy.fromfile 读取了未格式化(直接访问,非顺序)的 Fortran 文件。您必须使用 file.seek() 方法跳过开始记录和结束记录标记并使用它们的大小播放,直到您找到正确的标记(使用 4 或 1 字节开始,这些应该是最常见的的)。
-
您可以向我们展示错误结果的样子。读取的数组有多大?它们的价值是什么?
-
相关/重复:stackoverflow.com/questions/8131204/…stackoverflow.com/questions/15608421/…stackoverflow.com/questions/23377274/… 更多内容也可以通过搜索从 C 和 C++ 中找到。