Python在文件中搜索字符串并将下面的行分配给变量

时间:2017-04-18 03:37:06

标签: python

我必须在文件中搜索一个字符串,并将接下来的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我需要分配第二行输出,但我得到两行输出。

请帮忙

2 个答案:

答案 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行,并将它们分配给变量var1var2var3

原始问题的原始答案

问题是第一个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)

要理解的一个关键想法是下面的fiterable。新手经常会感到惊讶的是,由于迭代器的工作方式,你只能通过一次这些行(当它们“完成”并且不重置时会引发一个特殊的异常)。但是,我们不必使用整个迭代器。在下面的代码中,当我找到字符串时,我停止,并且迭代器尚未完全消耗。然后,我可以通过显式调用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()