Python:找到字符串后读取行
我有一个文件,其中包含我想分离的行块。每个块在块的标题中包含一个数字标识符:“块X”是第X行块的标题行。像这样:Python:找到字符串后读取行,python,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.444
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
...
我可以使用“枚举”查找块的标题行,如下所示:
with open(filename,'r') as indata:
for num, line in enumerate(indata):
if 'Block X' in line:
startblock=num
print startblock
这将产生块#X的第一行的行号。但是,我的问题是识别块的最后一行。为此,我可以找到标题行的下一个匹配项(即下一个块)并减去几个数字 我的问题是:如何在下一个条件出现时(即,在满足某个条件之后)找到a的行号 我再次尝试使用enumerate,这次指示起始值,如下所示:
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”开始。相反,通过从不同的数字启动“enumerate”计数器,计数器的结果值(在本例中为“endscan”)从0移位“startblock”
求求你,救命!如何告诉python忽略“startblock”前面的行 可以使用文件对象的.tell()和.seek()方法来移动。例如:
with open(filename, 'r') as infile:
start = infile.tell()
end = 0
for line in infile:
if line.startswith('Block'):
end = infile.tell()
infile.seek(start)
# print all the bytes in the block
print infile.read(end - start)
# now go back to where we were so we iterate correctly
infile.seek(end)
# we finished a block, mark the start
start = end
如果希望组使用
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']
If块可以出现在其他位置,但只有在后跟空格和单个字符时才需要它:
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]))
如果标题行之间的差异在整个文件中是一致的,只需使用距离相应地增加索引变量
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,这仅在该行对应于a标题行时才会发生。一旦行被固定,我们就进入填充数组的第二个for循环,这样我们就有了一个矩阵,即numlines行数和diff列数。非零行将包含标题行之间的数据
我还没有试过,我只是写下了我的头顶。希望能有帮助 保留所有行,直到在列表中找到块标题。找到标题后,从存储的行中找出所需内容并清除列表