我有一个文件,其中包含我想要分隔的行块。每个块在块头中包含一个数字标识符:“块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”之前的行?
答案 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数量的列。非零行将包含标题行之间的数据。
我没有试过这个,我只是写下了我的头脑。希望它有所帮助!