我必须在文件中搜索一个字符串,并将接下来的3行分配给变量var1,var2,var3
我试过下面的代码:
from itertools import islice
with open('test.txt') as f:
for line in f:
if 'Ball' in line:
a = (''.join(islice(f, 1)))
b = (''.join(islice(f, 2)))
在上面的代码中,它在测试文件中搜索Ball并将下一行分配给变量a
并且对于b我需要分配第二行输出,但我得到两行输出。
请帮忙
答案 0 :(得分:1)
针对问题的新变体进行了更新
您正在为b
分配2行,因为您要求islice()
通过将2
作为end
参数的值传递给您2行。你可以这样做:
with open('test.txt') as f:
for line in f:
if 'Ball' in line:
var1 = ''.join(islice(f, 1))
var2 = ''.join(islice(f, 1))
var3 = ''.join(islice(f, 1))
使用islice()
一次一行行。尽管如此,使用next()
会更好:
var1 = next(f)
var2 = next(f)
var3 = next(f)
仍在使用islice()
的更简洁的方法是:
from itertools import islice
with open('test.txt') as f:
for line in f:
if 'Ball' in line:
var1, var2, var3 = islice(f, 3)
读取接下来的3行,并将它们分配给变量var1
,var2
和var3
。
原始问题的原始答案
问题是第一个for循环在输入第二个for循环之前消耗整个文件。第二个循环立即终止,因为已经读取了所有行。
在分配到break
后,尝试在第一个循环中添加a
。
from itertools import islice
with open('test.txt') as f:
for line in f:
if 'Ball' in line:
a = (''.join(islice(f, 1)))
break
for line in f:
if 'Bat' in line:
b = (''.join(islice(f, 2)))
break
将在找到包含Ball
的行后面的第一个循环终止。然后第二个for循环可以继续处理下一行的文件(如果有的话)。
如果您只需要Bat
之后的两行中的第二行,则可以将start
传递给islice()
:
for line in f:
if 'Bat' in line:
b = islice(f, 1, 2)
这是有效的,因为默认开始时间为0
,因此指定1
会跳过第一行。
答案 1 :(得分:1)
要理解的一个关键想法是下面的f
是iterable。新手经常会感到惊讶的是,由于迭代器的工作方式,你只能通过一次这些行(当它们“完成”并且不重置时会引发一个特殊的异常)。但是,我们不必使用整个迭代器。在下面的代码中,当我找到字符串时,我停止,并且迭代器尚未完全消耗。然后,我可以通过显式调用f.next()
来使用接下来的三行。我还可能有另一个循环,它将继续在最后一个停止的地方。请注意,为简单起见,我遗漏了错误检查(如果文件不包含Ball
会发生什么?
with open('test.txt') as f:
# First scan for 'Ball'
for line in f:
if 'Ball' in line:
break
# next three lines into variables
var1 = f.next()
var2 = f.next()
var3 = f.next()