使用Python2编写二进制访问流数据,供Fortran读取

2024-04-25 20:40:11 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

“form='unformatted'”和“access='stream'”。你知道吗

我希望用python2编写一个二进制文件,这样我就不需要“access='stream'”。我将这个二进制文件与Fortran中的大量非公共代码(我没有开发)结合使用,并且不想接触源代码。我做的改变只是为了测试我自己。你知道吗

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

我以前是用下面的(byteswap()来改变endianness)来写二进制文件的,但没有用。你知道吗

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

我也试着用np.ASCONTIGUUSARRAY公司以及np.asfortran数组将数据写入二进制文件,但也不起作用。你知道吗

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

我试过了结构包同样,根据this link。我不知道还有什么其他的途径可以追求。。。我感谢您的想法/意见!你知道吗

我希望一切都有意义。。你知道吗


Tags: 文件数据streamaccessnp二进制arraywrite
1条回答
网友
1楼 · 发布于 2024-04-25 20:40:11

嗯,这可能很棘手。二进制输入/输出特别依赖于所选的Fortran编译器,限制了可移植性。你知道吗

在非匹配的顺序或直接输入/输出的情况下,Fortran使逻辑记录被读或写。Fortran在写入的数据的开头和结尾插入整数字节计数。你知道吗

下面是一个使用fort77的长度为2和3的两条记录的示例。用于生成二进制文件的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来更改。你知道吗

相关问题 更多 >

    热门问题