python - 在 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 。我不确定最好追求什么其他途径......我很感激想法/投入!
我希望一切都有意义..
解决方案
好吧,这可能非常棘手。二进制输入/输出特别依赖于所选的 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
。
推荐阅读
- python - Django:不会自动选择特定用户的帖子
- vb.net - VB NET 如何将编码字符集以 vb 形式和附属成员
- javascript - 如何将 3 种颜色设置为同一个 chartjs 栏?
- ios - 将子层添加到没有情节提要的 UITextField 不会设置文本字段的样式
- python - 根据另一个列表中的值创建相应的 RGB 列表(颜色图)
- python-3.x - 当前线程 0x00002fe0(最近一次调用优先):
- docker - 挂载卷会覆盖存储在 Docker 映像中的文件
- html - 如何在支持所有 IE 浏览器的 UI 上创建带计时器的圆圈
- php - 通过 LAN 将在线内容共享到另一台未连接到 Internet 的计算机
- c - 为什么当我从同一个指针获取值时结果不同