当前位置: 首页 > 面试题库 >

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

叶德本
2023-03-14
问题内容

我是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代码中使用什么“
timeslice”值,我都将获得第一个时间片。到目前为止,我的代码是:

#!/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()

我希望def
readslice能够在timelice等于i的情况下读取第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”中的参数是多余的。希望这有帮助。



 类似资料:
  • 问题内容: 我有一个fortran程序会生成未格式化的文件,并且正在尝试将它们读入Python。 我有源代码,因此我知道第一个“块”是的字符数组,依此类推。所以我开始 并且是一个80长度的元组,由长度为1的字符串组成;其中一些内容是十六进制字符串(例如)。如何将这个变量转换为单个ascii字符串? 问题答案: 大多数Fortran未格式化文件将包含额外的字节来指定记录的长度。记录是用单个Fortr

  • 问题内容: 我的情况是我有一个包含一些文件(txt,png,…)的zip文件,我想直接按它们的名称读取它,我已经测试了以下代码,但没有结果(NullPointerExcepion): resources 是一个包, zipfile 是一个zip文件。 问题答案: 如果您可以确定您的zip文件永远不会打包在另一个jar中,则可以使用以下方法: 要么: 否则,您的选择是: 使用ZipInputStre

  • 本文向大家介绍Python如何读取文件中图片格式,包括了Python如何读取文件中图片格式的使用技巧和注意事项,需要的朋友参考一下 这篇文章主要介绍了Python如何读取文件中图片格式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 正常情况下,图片命名的后缀和图片的格式一致,但可能某些情况下,图片的原格式和命名的后缀不一样,查看图片的实际格式 以

  • 我收到的csv文件格式不正确(无法控制生成此csv的应用程序) CSV的标题和第一行如下所示: 这是我用来读取csv的代码: 这是我收到的输出: 第一个问题是奇怪的字符(可能缺少编码选项?)另外,标题是错误的,不能在该格式上使用DictReader,这对于编辑CSV非常有用。 我可以重写一个新的CSV与标题正确格式化,这不是一个问题,但我不知道如何跳过CSV的前3行!?或者我可以用CSV即将到来的

  • fscanf() 和 fprintf() 函数与前面使用的 scanf() 和 printf() 功能相似,都是格式化读写函数,两者的区别在于 fscanf() 和 fprintf() 的读写对象不是键盘和显示器,而是磁盘文件。 这两个函数的原型为: fp 为文件 指针,format 为格式控制字符串,... 表示参数列表。与 scanf() 和 printf() 相比,它们仅仅多了一个 fp 参

  • 问题内容: 我的网站上有一个说 “ check.php” 的php文件,在提交表单时执行。 说我的网站是 “ myweb.com” ,而php文件在目录“ PHP”中 我想防止直接访问“ check.php”文件的网址,即,如果有人键入网址“ **_myweb.com/PHP/check.php_** ”,则不应执行该php文件,而应返回一条错误消息。 我试图通过在.htaccess中设置规则来阻