我有一个文件,其中包含我想要分隔的行 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/