首页 > 解决方案 > 在 Python2 中编写二进制访问流数据以在 Fortran 中读取

问题描述

我没有 Fortran 的工作知识,也不是 Python(2) 的高级用户,所以请记住这一点,请理解!

我正在尝试使用 Python2 将一些数据写入二进制文件(使用“wb”打开一个空的二进制文件),该文件必须在 Fortran 中作为“未格式化”文件(.f90 文件)打开。问题是,如果我在 Fortran 中打开文件时,可以(在 Fortran 中)读取这种 Python 生成的二进制文件,

“form='unformatted'”和“access='stream'”。

我希望在 Python 2 中编写一个二进制文件,这样我不需要“access='stream'”。我将这个二进制文件与 Fortran 中的大量非公开代码(我没有开发)一起使用,并且根本不想接触源代码。我只是为了测试自己而做出改变。

如果我不使用“access='stream'”,那么我只会得到输出的无意义值。

我之前使用以下(byteswap() 更改字节顺序)来编写二进制文件,但无济于事。

dxidxup = 1/dxm
dxidxup = np.array(dxidxup,dtype='<f4')
dxidxup_write = dxidxup.byteswap()
dxidxup_write.tofile(new_mesh)

我还尝试使用 np.ascontiguousarray 和 np.asfortranarray 将数据写入二进制文件,但它也不起作用。

dxidxup = 1/dxm
dxidxup = np.array(dxidxup)
dxidxup = np.ascontiguousarray(dxidxup,dtype='<f4')
dxidxup_write = dxidxup.byteswap()
dxidxup_write.tofile(new_mesh)

根据此链接,我也尝试过 struct.pack 。我不确定最好追求什么其他途径......我很感激想法/投入!

我希望一切都有意义..

标签: pythonfortran

解决方案


好吧,这可能非常棘手。二进制输入/输出特别依赖于所选的 Fortran 编译器并限制了可移植性。

在 UNFORMATED SEQUENTIAL 或 DIREC 输入/输出的情况下,Fortran 会导致逻辑记录被读取或写入。Fortran 在写入数据的开头和结尾插入一个整数字节计数。

这是一个示例,其中有两条长度为 2 和 3 的记录与fort77. 用于生成二进制文件的 Python 代码:

import struct
fh = open('two_records.bin', 'wb')
fh.write(struct.pack('l',2)) # Compiler dependent
fh.write('ab')
fh.write(struct.pack('l',2))
fh.write(struct.pack('l',3))
fh.write('cde')
fh.write(struct.pack('l',3))
fh.close()

读取文件的 Fortran 77 代码:

      character*2 a
      character*3 b
      open(12, FILE='two_records.bin', FORM='unformatted')
      read(12) a
      read(12) b
      close(12)
      end

如果您更喜欢任何其他编译器,则必须确定字节数是int还是longint. 相比之下f2c,默认情况下gfortran使用int32可以通过设置更改-frecord-marker=8


推荐阅读