【问题标题】:How can i pass a line number in a for loop to traverse a text file?如何在 for 循环中传递行号来遍历文本文件?
【发布时间】:2021-08-23 13:28:15
【问题描述】:

我有一个文本文件,只有在找到关键字后我才想在其中开始执行任务。但是我要搜索的关键字在文件中出现了两次。我只想对第二个关键字之后的文本执行该任务。

我可以获得第二次出现所需关键字的行,但是如何将其传递给 for 循环并完成我的任务。

我正在寻找类似的东西:

with open(r"myfile.txt") as openfile:
    for line in (line_number, openfile):
        #Do my task to the line

其中 line_number 是我第二次找到关键字的数字

【问题讨论】:

    标签: python file for-loop text line-numbers


    【解决方案1】:

    如果您只想处理关键字第二次出现的行之后的行,则不应查找行号。相反,您可以将文件对象视为一个迭代器,并使用生成器表达式过滤带有关键字的行,并使用itertools.islice 来使用直到第二次出现关键字的行。

    例如,下面的代码会跳过行,直到关键字 begin 第二次出现:

    from itertools import islice
    
    keyword='begin'
    with open('myfile.txt') as openfile:
        list(islice((line for line in openfile if keyword in line), 0, 2))
        for line in openfile:
            print(line, end='')
    

    这样给定myfile.txt的内容:

    header
    begin
    second header
    begin
    foo
    bar
    

    上面的代码会输出:

    foo
    bar
    

    演示:https://replit.com/@blhsing/OnlyUtterFossil

    【讨论】:

      【解决方案2】:

      您可以使用一个简单的标志计数来确定第二次找到关键字:

      keyword = 'A'
      with open('test.txt') as fp:
          c, flag = 0, 0
          while True:
              line = fp.readline()
              if not line:
                  break
              c += 1
              print("Line {}: {}".format(c, line.strip()))
              if keyword in line:
                  flag += 1
              if keyword in line and flag == 2:
                  print('do some tasks')
      

      输出

      Line 1: C E
      Line 2: A F
      Line 3: E
      Line 4: C D
      Line 5: A B
      do some tasks
      Line 6: 1 C E
      

      更好的方法(相同的输出)是使用enumerate

      keyword = 'A'
      with open('test.txt') as fp:
          flag = 0
          for c, line in enumerate(fp):
              print("Line {}: {}".format(c+1, line.strip()))   #remove whitespace characters like `\n` at the end of each line
              if keyword in line:
                  flag += 1
              if keyword in line and flag == 2:
                  print('do some tasks')
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-04-10
        • 1970-01-01
        相关资源
        最近更新 更多