通过使用numpy递归跳过行来读取文本文件

时间:2017-04-11 18:20:12

标签: python arrays numpy

我的数据文件如下所示,

# some text
# some text
# some text
100000 3 4032
 1 0.0125 101.27 293.832
 2 0.0375 108.624 292.285
 3 0.0625 84.13 291.859
200000 3 4032
 4 0.0125 101.27 293.832
 5 0.0375 108.624 292.285
 6 0.0625 84.13 291.859
300000 3 4032
 7 0.0125 101.27 293.832
 8 0.0375 108.624 292.285
 9 0.0625 84.13 291.859
........ 

我想将这些数据读入数组以进行进一步处理。但是我只需要有四列的数据。因此,我必须跳过三列数据或将它们存储在不同的数组中。由于这个数据文件很大并且以相同的方式重复,因此如果我能够一次性阅读这个数据文件会更容易。 我用itertools.islice(文件,4,7)尝试过numpy.genfromtxt(file)但是找不到将所有四列数据存储到单个数组的方法(因为它们之间有三个列数据) 。 任何有关这方面的帮助将不胜感激。 谢谢!

import itertools as IT   
import numpy as np

arr=[]

with open('data.txt', 'rb') as f:    
     ln = IT.islice(f, 4, 7)   
     arr.append(np.genfromtxt(ln))     
     ln = IT.islice(f, 1, 4)   
     arr.append(np.genfromtxt(ln))
     ln = IT.islice(f, 1, 4)   
     arr.append(np.genfromtxt(ln))
print arr 

此代码有效但我的数据文件比上面的例子大得多。因此,我不想重复代码,因为它不会有效。是否有更优雅的方式来实现这一目标?

1 个答案:

答案 0 :(得分:1)

这似乎就是你想要的。

from io import StringIO
dataFile = StringIO('''\
# some text
# some text
# some text
100000 3 4032
 1 0.0125 101.27 293.832
 2 0.0375 108.624 292.285
 3 0.0625 84.13 291.859
200000 3 4032
 4 0.0125 101.27 293.832
 5 0.0375 108.624 292.285
 6 0.0625 84.13 291.859
300000 3 4032
 7 0.0125 101.27 293.832
 8 0.0375 108.624 292.285
 9 0.0625 84.13 291.859''')

def wantedLines():
    count = -1
    with dataFile as data:
        while True:
            line = data.readline()
            if line: line = line.strip()
            else: break
            if line.startswith('#'): continue
            else:
                count +=1
                if count % 4==0: continue
                else: yield line.encode()

import numpy as np

result = np.genfromtxt(wantedLines())
print (result)

result

[[  1.00000000e+00   1.25000000e-02   1.01270000e+02   2.93832000e+02]
 [  2.00000000e+00   3.75000000e-02   1.08624000e+02   2.92285000e+02]
 [  3.00000000e+00   6.25000000e-02   8.41300000e+01   2.91859000e+02]
 [  4.00000000e+00   1.25000000e-02   1.01270000e+02   2.93832000e+02]
 [  5.00000000e+00   3.75000000e-02   1.08624000e+02   2.92285000e+02]
 [  6.00000000e+00   6.25000000e-02   8.41300000e+01   2.91859000e+02]
 [  7.00000000e+00   1.25000000e-02   1.01270000e+02   2.93832000e+02]
 [  8.00000000e+00   3.75000000e-02   1.08624000e+02   2.92285000e+02]
 [  9.00000000e+00   6.25000000e-02   8.41300000e+01   2.91859000e+02]]