gpt4 book ai didi

python - 取消文件的最后一行迭代

转载 作者:行者123 更新时间:2023-11-28 16:32:11 27 4
gpt4 key购买 nike

我需要迭代一个文件,在一个条件下停止迭代,然后在同一行用另一个函数继续解析文件(这可能会改变,所以我不能只在前一个函数中添加内容)。

示例文件(file.txt):

1
2
3
4
5
6
7
8
9

我尝试做的功能:

def parse1(file, stop):
# 1st parsing function (Main function I am doing)
for line in file:
if line.strip() == stop:
# Stop parsing on condition
break
else:
# Parse the line (just print for example)
print(line)

def parse2(file):
# 2nd parsing function (Will be my own functions or external functions)
for line in file:
# Parse the line (just print for example)
print(line)

终端结果:

>>> file = open("file.txt")

>>> parse1(file, "4")
1
2
3

>>> parse2(file)
5
6
7
8
9

我的问题是,当我查找条件时,“4”行被第一个函数跳过。

我怎样才能避免这种情况:我找到了取消上一次迭代或返回一行的任何解决方案。

file.tell() 函数不适用于文件上的 for

我试着用 while + file.readline() 来做这件事,但它比文件上的 for 循环慢很多(我想解析具有数百万行的文件)。

是否有一个优雅的解决方案来保持 for 循环的使用?

最佳答案

在 python3 中,'for line in file' 结构在内部由迭代器表示。根据定义,从迭代器生成的值不能“放回”供以后使用 (http://www.diveintopython3.net/iterators.html)。

要获得所需的行为,您需要一个将两个迭代器链接的函数,例如 chain itertools 模块提供的函数。在 parse1 的停止条件中,您将最后一行与文件迭代器一起返回:

import itertools

def parse1(file,stop):
# 1st parsing function
for line in file:
# Stop parsing on condition
if line.strip() == stop:
return itertools.chain([line],file) # important line
else:
# Parse the line (just print for example)
print('parse1: '+line)

chain 语句连接两个迭代器。第一个迭代器只包含一个元素:您要再次处理的行。第二个迭代器是文件的剩余部分。一旦第一个迭代器用完值,就会访问第二个迭代器。

您不需要更改 parse2。为了清楚起见,我修改了打印语句:

def parse2(file):
# 2nd parsing function
for line in file:
# Parse the line (just print for example)
print('parse2: '+line)

然后,您可以以最函数式的方式调用 parse1 和 parse2:

with open('testfile','r') as infile:
parse2(parse1(infile,'4'))

上面一行的输出是:

parse1: 1
parse1: 2
parse1: 3
parse2: 4
parse2: 5
parse2: 6
parse2: 7
parse2: 8
parse2: 9

请注意,值“4”是如何由 parse2 函数生成的。

关于python - 取消文件的最后一行迭代,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30840135/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com