使用 python 读取 fortran 无格式数组,无需 numpy



我对Python很陌生。我正在尝试使用 Python 读取未格式化的 Fortran 文件。但是,我想将读取到数组中的元素结构化。我为您准备了一个示例,以帮助您了解我的问题。在下面,您可以找到一个Fortran编写器,它写入三个整数,然后是具有三个双精度元素的行。

    program writer
    integer :: dummy,dummy2,dummy3
    double precision,dimension(3) :: dummy_double
          dummy=1
          dummy2=2
          dummy3=3
          dummy_double(1)=4.23e0
          dummy_double(2)=5.4e0
          dummy_double(3)=7.61e0
          open(100,file="binary",form="unformatted",convert="little_endian")
          write(100) dummy
          write(100) dummy2
          write(100) dummy3
          write(100) dummy_double(1:3)
          close(100)
          end

我现在想在不使用 numpy 的情况下使用 Python 读取此文件。我知道每条记录的末尾和开头都有 INTEGER*4。我跳过文件开头的前 4 位,然后读取第一个整数,然后跳过 8 位(结束+开始(,依此类推。没有分隔符以相同的顺序写入,即双精度不被 INTEGER*4 分隔(如果我错了,请纠正我..(。我写信给你是因为我无法阅读最后一行,有 3 个双精度记录。我想将它们存储在comp[3]数组中。

import struct
with open("binary", "rb") as f:
#    while True:
        dummy = f.read(4)
        print "dummy=",struct.unpack('i', f.read(4))[0]
        dummy = f.read(8)
        print "dummy2=",struct.unpack('i', f.read(4))[0]
        dummy = f.read(8)
        print "dummy3=",struct.unpack('i', f.read(4))[0]
        comp = [0] * 3
        print "length=",len(comp)
        dummy = f.read(8)
        comp=struct.unpack('<d', f.read(8))[0:2]
        print "comp=",comp[0],comp[1],comp[2]

我得到的错误如下:

$carlo: python Script_Library.py
dummy= 1
dummy2= 2
dummy3= 3
length= 3
comp= 4.23000001907
Traceback (most recent call last):
  File "Script_Library.py", line 14, in <module>
    print "comp=",comp[0],comp[1],comp[2]
IndexError: tuple index out of range

正确读取整数以及第一个双精度元素。但是,它们未正确存储。你能纠正脚本中不起作用的部分吗?

亏了杜拉斯姆,这个问题就解决了。

我在这里报告工作代码:

program writer
integer :: dummy,dummy2,dummy3
double precision,dimension(3) :: dummy_double
          dummy=1
          dummy2=2
          dummy3=3
          dummy_double(1)=4.23e0
          dummy_double(2)=5.4e0
          dummy_double(3)=7.61e0
          open(100,file="binary",form="unformatted",convert="little_endian")
          write(100) dummy
          write(100) dummy2
          write(100) dummy3
          write(100) dummy_double(1:3)
          close(100)
end

您可以在下面找到更正后的脚本。首先,无需分配comp.然后,我们有三条双精度记录要读取,相当于24 bits和三倍ddd

import struct
with open("binary", "rb") as f:
        dummy = f.read(4)
        print "dummy=",struct.unpack('i', f.read(4))[0]
        dummy = f.read(8)
        print "dummy2=",struct.unpack('i', f.read(4))[0]
        dummy = f.read(8)
        print "dummy3=",struct.unpack('i', f.read(4))[0]
        dummy = f.read(8)
        comp=struct.unpack('<ddd', f.read(24))
        print "comp=",comp[0],comp[1],comp[2]

结果是:

$carlo: python Script_Library.py
dummy= 1
dummy2= 2
dummy3= 3
comp= 4.23000001907 5.40000009537 7.61000013351

我认为你的问题出在这条线上:

comp=struct.unpack('<d', f.read(8))[0:2]

如果您使用[a:b]的内容索引列表,它将返回从 ab-1 的值列表:

>>> [1, 2, 3, 4][0:2]
[1, 2]

因此,在此行之后,comp是一个具有两个值的列表/数组,而不是三个值。因此comp[2]将失败,并出现索引超出范围错误。

最新更新