使用枚举函数遍历文件

Using enumerate function to iterate over a file

我有一个包含大约 50 个块(每行 14 行)的文件,每个块都以我可以搜索的特定字符串开头。由于文件在其他方面相当大,我将枚举函数用作:

def search_and_return_a_block(l_no,file_path, string):
    with open(file_path, 'r') as file:
        for l_no, line in enumerate(file):
                if string in line:
                     #append lines into a list of 14 lines
                     break
        return list,l_no

现在,我只想要 50 个块中的前 2 个块,所以当我调用此函数时,我希望从第一个块的底部开始搜索,而不是从文件的开头开始搜索。该函数 return 第一次更正行号。

然而,上面的 for 循环总是从 0 开始并忽略我调用它的第一个参数 (l_no) 的值。这会导致它只打印第一个块 2 次而不会移动到下一个块。

我也尝试使用枚举函数的可选参数,但没有成功。有没有一种优雅的方法可以做到这一点?

我不完全确定你想要实现什么,我也不是 Python 2 专家(不再),所以这可能不是你要找的:

from itertools import islice

def search_and_return_a_block(start, file_path, string):
    block = []
    no = start
    with open(file_path, 'r') as file:
        for no, line in enumerate(islice(file, start, None), start=start + 1):
            block.append(line.rstrip()) 
            if string in line:
                 break
    return block, no

如果你运行

start = 0
for _ in range(10):
    block, start = search_and_return_a_block(start, 'file.txt', 'a')
    print(block, start)

因为file.txt喜欢

a
b
c
a
b
c
d
a
b
c
d
e
a
b
a
a
a
b
c
d

您将得到以下输出:

['a'] 1
['b', 'c', 'a'] 4
['b', 'c', 'd', 'a'] 8
['b', 'c', 'd', 'e', 'a'] 13
['b', 'a'] 15
['a'] 16
['a'] 17
['b', 'c', 'd'] 20
[] 20
[] 20

但也许生成器函数更适合您的需求?你可以这样做:

def search_and_return_a_block(start_block, file_path, string):
    with open(file_path, 'r') as file:
        blocks = 1
        out = True if start_block == 1 else False
        block = []
        for line in file:
            if out:
                block.append(line.rstrip()) 
                if string in line:
                    yield block
                    block = []
            elif string in line:
                blocks += 1
                if blocks == start_block:
                    out = True

当您对同一文件执行以下操作时

blocks = search_and_return_a_block(2, 'file.txt', 'a')
block_2 = next(blocks)
print(block_2)
block_3 = next(blocks)
print(block_3)

结果看起来像

['b', 'c', 'a']
['b', 'c', 'd', 'a']