我有一个 Fortran 文件,可以生成二维数组中的一些数字,例如:
program WriteBinaryFile
real(kind=4)::myarray(140,130)
integer(kind=4):: num1, num2
character*120 filename
! Insert some numbers, i.e., number 1 through 18200=140*130
do num=1,140
do num2=1,130
myarray(num1,num2)=(num1-1)*130+num2
end do
end do
filename="binaryFile"
open(22,file=filename,form='unformatted',access='direct',recl=140*130*4,&
iostat=ios)
irec=1
write(22,rec=irec)myarray
close(22)
! Some other things happen.
end program WriteBinaryFile
我正在尝试将其读入Python,但到目前为止我还没有成功;使用numpy.fromfile或scypi.io.FortranFile:
import numpy as np
f = np.fromfile("binaryFile")
或
from scypi.io import FortranFile
f = FortranFile("binaryFile", "r")
myarray = f.read_reals()
它们不起作用。第一个程序输出一堆没有意义的数字,后者抛出一个异常,指出:“scipy.io._fortran.FortranFormattingError: End of file in the middle of a record”。
我尝试过做不同的事情,如帖子中所述:
- Reading Fortran binary file in Python
- https://numpy.org/doc/stable/reference/generated/numpy.fromfile.html
- https://docs.scipy.org/doc/scipy/reference/generated/scipy.io.FortranFile.html
- 等等
没有用!第一个链接是最接近的。帮助解决此问题将不胜感激。
我能够使用 Fortran 恢复文件内容,但不能使用 Python。
其他信息。
- 这是我机器上的程序记录。原始文件是在一台我不了解的机器中生成的,除了它生成该文件之外;即不知道编码、编译器版本等。
最佳答案
首先,您的 Fortran 示例不正确。它创建了一些myarray
,但随后写入了一些toast
。在与他人共享的任何 Fortran 代码中始终使用 IMPLICIT NONE
。
scipy.io.FortranFile
对于这种情况是没有用的。它用于顺序访问文件。您的文件可以直接访问。实际上,直接访问文件与流访问文件相同,并且与用 C 编写的文件相同(但按列优先顺序)。
您可以使用numpy.fromfile
读取数据
array_data = np.fromfile(file, dtype=np.float32).reshape([nx, ny], order='F')
如果用于创建文件的机器是某种 bigendian-RISC,您可能必须转换字节顺序(ndarray.byteswap
或直接将缓冲区读取为 bigendian)。
我建议在十六进制编辑器中打开该文件,看看存储在那里的数字作为小尾数 float 或大尾数 float 是否有意义。
关于python - 将 Fortran 二进制文件读入 Python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72577745/