gpt4 book ai didi

python - 在 Python 中读取直接访问的 Fortran 未格式化文件

转载 作者:太空狗 更新时间:2023-10-30 00:57:12 26 4
gpt4 key购买 nike

我是 Python 的新手,正在从头开始用 Python 编写我的可视化代码(以避免使用 IDL 等昂贵的专有程序)。到目前为止,我一直在使用 IDL 和 gnuplot。我希望能够做的是:

我使用 fortran 将二维数组写入未格式化的直接访问文件,我希望能够在 python 中读取这些文件。下面给出了具体的测试代码。实际代码是一个巨大的并行代码,但数据输出的格式几乎完全相同。

program binary_out
implicit none
integer :: i,j,t,rec_array
double precision, dimension(100,100) :: fn
double precision, parameter :: p=2*3.1415929
INQUIRE(IOLENGTH=rec_array) fn
open(unit=10,file='test',status='new',form='unformatted',access='direct',recl=rec_array)
fn=0
write(10,rec=1) fn
do t=1,3
do i=1,100
do j=1,100
fn(i,j)=sin(i*p*t/100)*cos(j*p*t/100)
enddo
enddo
write(10,rec=t+1) fn
enddo
close(10)
end program binary_out

该程序应该为 t=1 提供零,并为增加 t 的值提供越来越多的“岛”。但是当我使用下面给出的 python 代码读取它时,我只得到零。如果我删除零的第一个写入语句,我只会得到第一个时间片,而不管我在 python 代码中使用的“时间片”的值是多少。到目前为止我的代码是:

#!/usr/bin/env python
import scipy
import glob
import numpy as np
import matplotlib.pyplot as plt
import os, sys
from pylab import *

def readslice(inputfilename,field,nx,ny,timeslice):
f=open(inputfilename,'r')
f.seek(timeslice*nx*ny)
field=np.fromfile(inputfilename,dtype='d',count=nx*ny)
field=np.reshape(field,(nx,ny))
return field

a=np.dtype('d')
a=readslice('test',a,100,100,2)

im=plt.imshow(a)
plt.show()

如果时间片等于 i,我希望 def readslice 能够读取第 i 个位置的记录。为此,我尝试使用 f.seek 但它似乎不起作用。 numpy.fromfile 似乎是从第一条记录本身开始读取的。如何使 numpy.fromfile 从文件中的特定点读取?

我仍在努力适应 Python 风格并深入研究文档。非常感谢任何帮助和指点。

最佳答案

这是适合您的 Python 代码:

def readslice(inputfilename,nx,ny,timeslice):
f = open(inputfilename,'rb')
f.seek(8*timeslice*nx*ny)
field = np.fromfile(f,dtype='float64',count=nx*ny)
field = np.reshape(field,(nx,ny))
f.close()
return field

在您的原始代码中,您将文件名作为第一个参数传递给 np.fromfile 而不是文件对象 f。因此,np.fromfile 创建了一个新的文件对象,而不是使用您想要的文件对象。这就是为什么它一直从文件开头读取的原因。此外,f.seek 将字节数作为参数,而不是元素数。我将它硬编码为 8 以适合您的数据,但如果您愿意,您可以将其设为通用值。此外,readslice 中的字段参数是多余的。希望这会有所帮助。

关于python - 在 Python 中读取直接访问的 Fortran 未格式化文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10475839/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com