在不知道数据大小的情况下,将文件中的浮点数作为numpy数组读取

时间:2013-06-27 05:49:44

标签: python python-2.7 numpy binaryfiles fortran90

我有这个代码,它读取Fortran无格式数据文件并将ascii输出写入 一个新文件output.dat。我想把这个output.dat文件读成一个numpy数组。但是,fromfile实用程序会读取奇怪的值,我认为这是由于“dtype”不匹配造成的。我已经尝试了所有可能的dtypes但我仍然没有得到正确的值。有人可以指导我在这里做什么。

我的代码读取fortran未格式化并编写ascii,并将ascii文件读入 一个numpy数组:

# Code unformatierten Fortran-Dateien mit Python lesen

import numpy as np
from struct import *
import fortranfile as fofi
from array import array

f = fofi.FortranFile('extract.bin',endian='>',header_prec='i')
x = f.readInts()
xx = f.readReals('f')

print x
print 'Die Lange von x ist',len(x)
print 'Dies ist'
print xx[0:20]
print 'Die Lange ist',len(xx)
dd = list(xx)
d  = list(x)


df=len(xx)/8
print 'Der Wert ist',df
g = fofi.FortranFile('output.dat',mode='w')
g.writeRecord(str(d))
g.write('\n')
g.writeRecord(str(dd))
g.close()

filename = open('output.dat','rb')
field = np.fromfile(filename,dtype=np.float64)
filename.close()
print field

Python读取未格式化的fortran并将输出文件写为。该文件包含一些DLE,FS和NUL字符,我不知道如何删除。 'YS'字符也是转换的一部分。

  [1, 167, 133, 6]   
YS [0.0, 4.3025989e-07, 1.5446712e-06, 3.1393029e-06, 5.0430463e-06, 7.1382601e-06, `9.301104e-06, 1.1476222e-05, 1.3561337e-05, 1.5552534e-05, 1.7355138e-05, 1.9008177e-05, `2.0416919e-05, 2.1655113e-05, 2.2624969e-05, 2.3426954e-05, 2.3961067e-05, 2.4346635e-05, 2.4482841e-05, 2.4501234e-05, 2.4301233e-05, 2.4020905e-05, 2.3559202e-05, 2.3056287e-05, 2.2411346e-05, 2.1758024e-05, 2.1005515e-05, 2.0265579e-05, 1.9453466e-05, 1.8686056e-05, 1.7860904e-05, 1.7103739e-05, 1.6299076e-05, 1.5573576e-05, 1.4809892e-05, 1.4126301e-05, 1.3412908e-05, 1.2775883e-05, 1.2116507e-05, 1.1522323e-05, 1.0915101e-05, 1.0356307e-05, 

目前,我的输出是

[  1 167 133   6]
Die Lange von x ist 4 // The length of x is
Dies ist  // This is ( The actual value)
[  0.00000000e+00   4.30259888e-07   1.54467125e-06   3.13930286e-06
   5.04304626e-06   7.13826012e-06   9.30110400e-06   1.14762224e-05
   1.35613373e-05   1.55525340e-05   1.73551380e-05   1.90081773e-05
   2.04169191e-05   2.16551125e-05   2.26249686e-05   2.34269537e-05
   2.39610672e-05   2.43466347e-05   2.44828407e-05   2.45012343e-05]
Die Lange ist 133266 // The length is
Der Wert ist 16658  // The value (after reading with numpy) is
[  4.66529177e-062   3.47245665e-313   3.28870023e-086 ...,
   1.05249949e-153   1.69339332e-052   3.30673243e+093]

numpy读取后的值与之前的数组不同。我怎样才能解决这个问题 并将所有这些值读入我选择的numpy数组中?另外,如果你有更好的阅读fortran无格式文件的建议,请发表评论。

1 个答案:

答案 0 :(得分:1)

如果您使用的是Linux,请使用翻译实用程序tr 删除除0-9 + - 之外的所有字符。 e f inf NaN blanks tabs newlines:

tr -C -d '0-9 + \- . ef EF inf NaN \t\n'  < in  > out  # delete non-numbers

(不太确定这是否是你想要做的)。

另外,请使用fromfile( file, sep=' ' )
读取带有用空格分隔的数字的文本文件(空格,制表符,换行符);
默认sep=''用于读取二进制文件。

Viel Glueck