在 Python2 中写入二进制访问流数据以在 Fortran 中读取



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

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

"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)

我也尝试过结构包,根据这个链接。我不确定还有什么其他途径可以最好地追求......我感谢想法/意见!

我希望这一切都有意义..

嗯,这可能很棘手。二进制输入/输出特别取决于所选的Fortran编译器,并限制了可移植性。

在未格式化的顺序或 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使用可以通过设置-frecord-marker=8来更改int32

最新更新