Python:找到字符串后读取行

标签 python

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

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”来查找 block 的标题行,如下所示:

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

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

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

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

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”之前的行?

最佳答案

如果您希望使用 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]))

关于Python:找到字符串后读取行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34426449/

相关文章:

python - 如何重新排列 Pandas 列序列?

python - 从文本 block 中删除停用词

Python Beautiful Soup WebScraping : Return only new data?

python - 如何标记元音的第一次出现,将前面的辅音移动到结尾

python - 获取方法/函数中使用的类的列表

Python:在列表列表中查找重复项以编辑它们

python - Python 中 mkdir 和 makedirs 中的 FileExistsError 即使目录不存在

python - 无法嵌入 Bokeh 图

python - 以实例作为第一个参数的未绑定(bind)方法得到了字符串,但需要其他东西

python - mypy: "__eq__"与父类(super class)型 "object"不兼容