python - 将 Fortran 二进制文件读入 Python

标签 python fortran binaryfiles

我有一个 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.fromfilescypi.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”。

我尝试过做不同的事情,如帖子中所述:

  1. Reading Fortran binary file in Python
  2. https://numpy.org/doc/stable/reference/generated/numpy.fromfile.html
  3. https://docs.scipy.org/doc/scipy/reference/generated/scipy.io.FortranFile.html
  4. 等等

没有用!第一个链接是最接近的。帮助解决此问题将不胜感激。

我能够使用 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/

相关文章:

python - 如何在调用资源端点时仅返回一个文档?

python - 如何使用 Django 和 Python 根据表值授予权限

linux - 使用 eclipse 编译 Fortran 代码时出错...通过 Linux 终端使用 Gfortran 时没问题

fortran - Fortran 中快速向上/向下取整 double ?

python - 使用 Python 修改二进制文件

Youtube-API:上传二进制字幕文件 (ebu-STL)

Python 将数据框与日期列表进行比较,并根据结果分配一个字符串

python - 如何使用已保存模型中的 pk 提供成功 url?

fortran - 可分配的数组值函数。 gfortran 与 ifort

c++ - 为什么 istreambuf_iterator 提前工作