Python:找到字符串后读取行

时间:2015-12-22 23:53:50

标签: python

我有一个文件,其中包含我想要分隔的行块。每个块在块头中包含一个数字标识符:“块X”是第X行块的标题行。像这样:

Block X
#L E  C  A  F  X  M  N 
11.2145 15 27 29.444444 7.6025229 1539742 29.419783
11.21451 13 28 24.607143 6.8247935 1596787 24.586264
...
Block Y
#L E  C  A  F  X  M  N 
11.2145 15 27 29.444444 7.6025229 1539742 29.419783
11.21451 13 28 24.607143 6.8247935 1596787 24.586264
...

我可以使用“enumerate”来查找块的标题行,如下所示:

with open(filename,'r') as indata:
        for num, line in enumerate(indata):
            if 'Block X' in line:
                startblock=num
                print startblock

这将产生块#X的第一行的行号 但是,我的问题是识别块的 last 行。为此,我可以找到下一个标题行(即下一个块)并减去几个数字。

我的问题:如何找到下次出现的条件的行号(即,在满足某个条件后)?

我再次尝试使用枚举,这次指示起始值,如下所示:

with open(filename,'r') as indata:
        for num, line in enumerate(indata,startblock):
            if 'Block Y ' in line:
                endscan=num
                break            
    print endscan 

这不起作用,因为它仍然从第0行开始读取文件,而不是从行号“startblock”开始读取。相反,通过从不同的数字开始“枚举”计数器,计数器的结果值(在本例中为“endscan”)从0移动“startblock”的数量。

请帮忙!怎么能告诉python忽略“startblock”之前的行?

3 个答案:

答案 0 :(得分:1)

如果您希望使用Block的群组作为每个部分的分隔符,则可以使用itertools.groupby

from itertools import groupby

with open('test.txt') as f:
    grp = groupby(f,key=lambda x: x.startswith("Block "))
    for k,v in grp:
        if k:
           print(list(v) + list(next(grp, ("", ""))[1]))

输出:

['Block X\n', '#L E  C  A  F  X  M  N \n', '11.2145 15 27 29.444444 7.6025229 1539742 29.419783\n', '11.21451 13 28 24.607143 6.8247935 1596787 24.586264\n']
['Block Y\n', '#L E  C  A  F  X  M  N \n', '11.2145 15 27 29.444444 7.6025229 1539742 29.419783\n', '11.21451 13 28 24.607143 6.8247935 1596787 24.586264']

如果Block可以出现在其他地方,但只有在后跟空格和单个字符时才需要它:

import re

with open('test.txt') as f:
    r = re.compile("^Block \w$")
    grp = groupby(f, key=lambda x: r.search(x))
    for k, v in grp:
        if k:
            print(list(v) + list(next(grp, ("", ""))[1]))

答案 1 :(得分:0)

您可以使用文件对象的.tell()和.seek()方法移动。例如:

{{1}}

答案 2 :(得分:0)

如果标题行之间的差异在整个文件中是均匀的,只需使用距离来相应地增加索引变量。

    file1 = open('file_name','r')
    lines = file1.readlines()
    numlines = len(lines)
    i=0
    for line in file:
        if line == 'specific header 1':
           line_num1 = i
        if line == 'specific header 2':
           line_num2 = i
    i+=1 
   diff = line_num2 - line_num1

现在我们知道了用于循环获取数据的行号之间的差异。

    k=0
    array = np.zeros([numlines, diff])
    for i in range(numlines):
        if k % diff == 0:            
           for j in range(diff):
               array[i][j] = lines[i+j]
        k+=1

%是mod运算符,仅当k是文件中两个标题行之间的行号差的倍数时才返回0,这仅在行对应于标题行时发生。一旦线被修复,我们继续填充数组的第二个for循环,这样我们就有一个矩阵,即numlines行数和diff数量的列。非零行将包含标题行之间的数据。

我没有试过这个,我只是写下了我的头脑。希望它有所帮助!