python - 读取用 Python 编写的 Fortran 二进制文件

标签 python fortran binaryfiles fortran90

我正在尝试在 Fortran 中读取我用 Python 编写的二进制文件。 我知道如何做相反的事情(编写 Fortran 并阅读 Python)

这就是我在 Python 中编写文件 (.dat)(.txt)的方式。是检查数字

ph1 = np.linspace(-pi, pi, num=7200)

f_ph = open('phi.dat', 'w')
f_ph.write(ph1.tobytes('F'))
f_ph.close()

f_ph = open('phi.txt', 'w')
for aaa in ph1:
    ts = str(aaa) + '\n'
    f_ph.write(ts)
f_ph.close()

相反,我的 Fortran 代码如下所示:

       program reading

          real    realvalue
          integer i

        i=1

        open(unit=8,file='phi.dat',form='UNFORMATTED',status='OLD')


        do 
          read(8,END=999,ERR=1000)  realvalue
          write(*,'(1PE13.6)') realvalue
          i = i + 1
        enddo

999     write(*,'(/"End-of-file when i = ",I5)') i
        stop

1000    write(*,'(/"ERROR reading when i = ",I5)') i
        stop 

       end program reading

我在这个例子中模拟了这个程序 http://numerical.recipes/forum/showthread.php?t=1697

但是如果我运行它,我会得到这个:

[gs66-stumbras:~/Desktop/fortran_exp] gbrambil% ./reading
-2.142699E+00

End-of-file when i =     2

最佳答案

对于Python,你必须添加binary选项来打开,即

import numpy as np
pi = np.pi
ph1 = np.linspace(-pi, pi, num=7200)

f_ph = open('phi.dat', 'wb')
f_ph.write(ph1.tobytes('F'))
f_ph.close()

f_ph = open('phi.txt', 'w')
for aaa in ph1:
    ts = str(aaa) + '\n'
    f_ph.write(ts)
f_ph.close()

就 Fortran 而言,您必须考虑:

  • numpy 默认基本类型是(很可能)Float64,对应于 Fortran real(kind(1.d0))

  • 由于 Fortran 通常会在读/写之前和之后跳过/添加记录标记,因此您必须添加 access="stream" 来禁用此行为。到公开声明

program reading
real(kind(1.d0)) :: realvalue
integer :: i

i=1

open(unit=8,file='phi.dat',form='UNFORMATTED',status='OLD', access="stream")

do
    read(8,END=999,ERR=1000)  realvalue
    write(*,'(1PE13.6)') realvalue
    i = i + 1
enddo

999     write(*,'(/"End-of-file when i = ",I5)') i-1
stop

1000    write(*,'(/"ERROR reading when i = ",I5)') i-1
stop

end program reading

关于python - 读取用 Python 编写的 Fortran 二进制文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44074122/

相关文章:

python - 将sklearn导入python

Fortran 运行时警告 : temporary array

memory - 如何让我的 Fortran 程序使用一定量的 RAM?

linux - ELF中 ".note.ABI-tag"段有什么意义?

c - 使用 mmap 时整数存储为不正确的值

python - 用 Python 实现 SHA1-HMAC

python - 如何在 python 中避免使用 eval

java - 具有自定义对象的二进制文件 I/O - Java

Python,在列中拆分多个字符串

c++ - 将结构化数据类型从 Fortran 传递到 C++