我没有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
。