2017-04-11 70 views
0

读取文本文件通过递归跳过行我有一个数据文件是这样的,使用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 
........ 

我想,以作进一步处理阵列读取这些数据。不过,我只需要四栏数据。因此,我必须跳过三列数据或将它们存储在不同的数组中。由于这个数据文件很大,并且以相同的方式重复,如果我可以一次阅读这些数据文件,它会更容易。 我已经尝试numpy.genfromtxt(文件)与itertools.islice(文件,4,7),但无法找到一种方法来存储所有的四列数据到一个单一的数组(由于其中的三列数据)。 任何有关这方面的帮助将不胜感激。 谢谢!

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 

该代码正常工作,但是我的数据文件比上面的例子大得多。因此,我不想重复代码,因为它效率不高。有没有更好的方法来实现这个目标?

+3

向我们展示你的代码,并说明它是如何不符合您的期望。 – lit

+3

请在您的问题中插入数据的相关部分作为* text *,而不是链接到某个外部图像。 –

+0

你可以写一个读取所有行的文件读取器,但只传递4列的行吗?有点像阅读文件但跳过评论行。 'genfromtxt'对于任何能够给出它的行都很满意 - 一个文件,一个生成器,一行行。 – hpaulj

回答

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]] 
+0

谢谢比尔。我感谢您的帮助。 – tmat

+0

你是最受欢迎的。 –