首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >用Python编写Fortran非格式化文件

用Python编写Fortran非格式化文件
EN

Stack Overflow用户
提问于 2013-02-21 00:46:59
回答 2查看 4.7K关注 0票数 3

我有一些由Fortran77编写的单精度小端未格式化的数据文件。我正在使用Python使用以下命令读取这些文件:

代码语言:javascript
运行
复制
import numpy as np
original_data = np.dtype('float32')
f = open(file_name,'rb')                                                                                                 
original_data = np.fromfile(f,dtype='float32',count=-1)                                                                            
f.close()

在Python中进行了一些数据操作之后,我(正在尝试)使用以下命令使用Python将它们写回原始格式:

代码语言:javascript
运行
复制
out_file = open(output_file,"wb")                                                                                             
s = struct.pack('f'*len(manipulated_data), *manipulated_data)                                                                     
out_file.write(s)
out_file.close()

但它似乎不起作用。使用Python将数据写回原始fortran未格式化格式的正确方法是什么?

问题的详细信息:

我能够从Fortran中读取经过处理的最终文件。然而,我想使用一个软件(Paraview)来可视化这些数据。为此,我将未格式化的数据文件转换为*h5格式。我可以使用h5实用程序将原始数据和操作后的数据转换为h5格式。但是,虽然Paraview能够读取从原始数据创建的*h5文件,但Paraview无法读取从处理后的数据创建的*h5文件。我猜有些东西在翻译中丢失了。

这就是我用Fortran (单精度数据)打开Python编写的文件的方式:

代码语言:javascript
运行
复制
open (in_file_id,FILE=in_file,form='unformatted',access='direct',recl=4*n*n*n)

这是我用Fortran编写的原始未格式化数据:

代码语言:javascript
运行
复制
open(out_file_id,FILE=out_file,form="unformatted")

这些信息足够吗?

EN

回答 2

Stack Overflow用户

发布于 2013-02-22 00:20:59

您是否尝试过使用被操作的数据数组的.tofile方法?它将以C顺序写入数组,但能够编写纯二进制代码。

.tofile的文档还表明,这与以下内容相同:

代码语言:javascript
运行
复制
with open(outfile, 'wb') as fout:
    fout.write(manipulated_data.tostring())
票数 2
EN

Stack Overflow用户

发布于 2013-02-26 00:38:00

这将创建一个未格式化的顺序访问文件:

代码语言:javascript
运行
复制
open(out_file_id,FILE=out_file,form="unformatted")

假设您正在使用简单的write(out_file_id)a编写单个数组real a(n,n,n),您应该会看到文件大小为4*n^3+8字节。额外的8字节是在记录的开始和结束处重复的4字节整数(=4n^3)。

第二种形式:

代码语言:javascript
运行
复制
open (in_file_id,FILE=in_file,form='unformatted',access='direct',recl=4*n*n*n)

打开没有这些头的直接访问。对于现在的编写来说,你应该有write(unit,rec=1)a。如果您使用直接访问读取顺序访问文件,它将不会出错读取,但您将获得整数头读取作为浮点(垃圾)作为(1,1,1)数组值,然后所有其他内容都被移位。您说您可以使用fortran阅读,但您是否希望看到您真正阅读的是您期望的内容?

解决这个问题的最好方法是修复原始的fortran代码,使其在读取和写入时使用无格式的直接访问。这给了你一个“普通”的原始二进制文件,没有头文件。

或者,在python中,您需要首先读取这个4字节的整数,然后读取数据。在输出时,您可以根据您的paraview过滤器的期望,将整型标头放回或不放回。

-以下是python,用于读取/修改/写入包含单个记录的非格式化顺序fortran文件:

代码语言:javascript
运行
复制
import struct
import numpy as np
f=open('infile','rb')
recl=struct.unpack('i',f.read(4))[0]
numval=recl/np.dtype('float32').itemsize
data=np.fromfile(f,dtype='float32',count=numval)
endrec=struct.unpack('i',f.read(4))[0]
if endrec is not recl: print "error unexpected end rec"
f.close()
f=open('outfile') 
f.write(struct.pack('i',recl))
for i in range(0,len(data)):data[i] = data[i]**2  #example data modification
data.tofile(f)
f.write(struct.pack('i',recl)

只需循环处理多个记录..请注意,这里的数据是作为向量读取的,并假设都是浮点数。当然,您需要知道实际的数据类型才能使用它。还要注意,根据平台的不同,可能需要处理字节顺序问题。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14985311

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档