读取文件时如何跳过N条中心线?

How to skip N central lines when reading file?

我有这样的输入file.txt:

3
2
A
4
7
B
1
9
5
2
0       

我正在尝试读取文件并且

我当前的代码和当前输出如下:

with open('file.txt') as f:
    for line in f:
        if 'A' in line: ### Skip 2 lines!
            f.readline()        ### Skipping one line
            line = f.readline() ### Locate on the line I want
            print(line) 
        if 'B' in line: ## Skip 4 lines
            f.readline()        ### Skipping one line
            f.readline()        ### Skipping two lines
            f.readline()        ### Skipping three lines
            line = f.readline() ### Locate on the line I want
            print(line)             
        
'4\n'
7

'1\n'
'9\n'
'5\n'
2       
>>>

正在打印我想要的值,但也正在打印 4\n,1\n...,除此之外,我还需要写几个 f.realines() 这是不实用的。

有更好的方法吗?

我的预期输出是这样的:

7
2

如果你不喜欢重复 readline 然后将它包装在一个函数中,这样其余的代码就非常干净了:

def skip_ahead(it, elems):
    assert elems >= 1, "can only skip positive integer number of elements"
    for i in range(elems):
        value = next(it)
    return value

with open('file.txt') as f:
    for line in f:
        if 'A' in line:
            line = skip_ahead(f, 2)
            print(line) 
        if 'B' in line:
            line = skip_ahead(f, 4)
            print(line)             
    

至于额外输出,当您提供的代码在标准 python 解释器中是 运行 时,只有 print 语句会导致输出,因此没有额外的行,例如'1\n',这是某些上下文的特征,例如 IPython shell 当在语句上下文中找到表达式时,在这种情况下 f.readline() 单独在它自己的行上,所以它被检测为可能具有可能有趣的值。要抑制这种情况,您可以经常执行 _ = <expr> 来抑制输出。

这里有一个更简单的代码:

lines=open("file.txt","r").read().splitlines()
#print(str(lines))
for i in range(len(lines)):
    if 'A' in lines[i]:
        print(lines[I+2]) # show 2 lines down
    elif 'B' in lines[i]:
        print(lines[I+4]) # show 4 lines down

这会将整个文件读取为一个数组,其中每个元素都是文件的一行。然后它只是遍历数组并在找到它正在查找的行时直接将索引更改为 2(对于 A)和 4(对于 B)。