【问题标题】:Python to search a string in file and assign to below lines to variablePython在文件中搜索字符串并将以下行分配给变量
【发布时间】:2017-04-18 03:37:06
【问题描述】:

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

请帮忙

【问题讨论】:

  • 你可以把第二行赋值给变量 b 对吗?
  • 是的,在搜索字符串第二行到变量 b 之后

标签: python


【解决方案1】:

针对问题的新变体进行了更新

您将 2 行分配给 b,因为您通过将 2 作为 end 参数的值来要求 islice() 给您 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 循环之前消耗了整个文件。第二个循环立即终止,因为所有行都已被读取。

尝试在分配给a 后的第一个循环中添加break

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)))

一旦找到包含Ball 的行之后的行,break 将终止第一个循环。然后第二个 for 循环可以继续处理下一行的文件,如果有的话。

如果您只需要Bat 之后的两行中的第二行,您可以将start 传递给islice()

   for line in f:
       if 'Bat' in line:
           b = islice(f, 1, 2)

这是可行的,因为默认开始是 0,所以指定 1 会跳过第一行。

【讨论】:

  • @asteroid4u:我已经更新了我的答案以解决您修改后的问题
【解决方案2】:

要理解的一个关键概念是,下面的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()

【讨论】:

  • 如果 Ball 没有在文件中退出,我的变量将得到空输入。然后我会告诉没有条目
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-07-15
  • 1970-01-01
  • 1970-01-01
  • 2019-02-20
  • 1970-01-01
  • 1970-01-01
  • 2015-04-11
相关资源
最近更新 更多