编写的Fortran未格式化的文件与Python(Writing Fortran unformatt

2019-07-20 05:54发布

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

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使用以下命令原始格式:

out_file = open(output_file,"wb")                                                                                             
s = struct.pack('f'*len(manipulated_data), *manipulated_data)                                                                     
out_file.write(s)
out_file.close()

但它似乎并不奏效。 任何想法是在原FORTRAN未格式化的格式使用Python回写数据的正确方法吗?

这个问题的详细介绍:

我能够从Fortran的操纵数据读取最终文件。 不过,我想使用可视化软件(的Paraview)这些数据。 为此,我转换在* H5格式未格式化的数据文件。 我能够原始和操纵数据,使用H5公用事业H5格式转换。 不过,虽然是的Paraview能够读取原始数据创建的* H5文件的Paraview无法读取来自处理过的数据创建的* H5文件。 我猜的东西被迷失东京。

这是我正在打开被Python在Fortran语言编写的文件(单精度数据):

open (in_file_id,FILE=in_file,form='unformatted',access='direct',recl=4*n*n*n)

这是我对Fortran语言编写的原始数据格式化:

open(out_file_id,FILE=out_file,form="unformatted")

这个信息是否足够?

Answer 1:

您是否尝试过使用伪造的数据阵列的.tofile方法? 将用C的顺序排列,但是能够写入纯二进制的。

对于.tofile该文档还表明,这是一样的:

with open(outfile, 'wb') as fout:
    fout.write(manipulated_data.tostring())


Answer 2:

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

open(out_file_id,FILE=out_file,form="unformatted")

假设你正在编写的单个阵列real a(n,n,n)使用简单地write(out_file_id)a你应该看到的文件大小4 * N ^ 3 + 8个字节。 被一个4字节整数(= 4N ^ 3)重复记录的开始和结束的额外8个字节。

第二种形式:

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文件:

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)

只是循环多个记录..请注意,这里的数据被读取为载体,假定所有的彩车。 当然,你需要知道实际工作中的数据类型来使用,如果它..也知道你可能需要处理依赖于平台的字节顺序的问题。



文章来源: Writing Fortran unformatted files with Python