使用枚举函数遍历文件
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']
我有一个包含大约 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']