我对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]
的内容索引列表,它将返回从 a
到 b-1
的值列表:
>>> [1, 2, 3, 4][0:2]
[1, 2]
因此,在此行之后,comp
是一个具有两个值的列表/数组,而不是三个值。因此comp[2]
将失败,并出现索引超出范围错误。