Shield-pro
Shield-pro

Reputation: 21

How to print next line in python

I am trying to print next 3 lines after a match

for example input is :

Testing
Result
test1 : 12345
test2 : 23453
test3 : 2345454

so i am trying to search "Result" string in file and print next 3 lines from it:

Output will be :-

test1 : 12345
test2 : 23453
test3 : 2345454

my code is :

with open(filename, 'r+') as f:
    for line in f:
        print line
        if "Benchmark Results" in f:
            print f
            print next(f)

its only giving me the output :

testing

how do i get my desired output, help please

Upvotes: 1

Views: 19605

Answers (5)

RobertB
RobertB

Reputation: 1929

You are testing (and printing) "f" instead of "line". Be careful about that. 'f' is the file pointer, line has your data.

  with open(filename, 'r+') as f:
      line = f.readline()
      while(line):
          if "Benchmark Results" in line:
               # Current line matches, print next 3 lines
               print(f.readline(),end="")
               print(f.readline(),end="")
               print(f.readline(),end="")
          line = f.readline()

Upvotes: 1

Jose Haro Peralta
Jose Haro Peralta

Reputation: 999

I would suggest opening the file and spliting its content in lines, assigning the outcome to a variable so you can manipulate the data more comfortably:

file = open("test.txt").read().splitlines()

Then you can just check which line contains the string "Result", and print the three following lines:

for index, line in enumerate(file):
    if "Result" in line:
        print(file[index+1:index+4])

Upvotes: 2

LetzerWille
LetzerWille

Reputation: 5658

with open('data', 'r') as f:
    lines = [ line.strip() for line in f]
    # get "Result" index
    ind = lines.index("Result")
    # get slice, add 4 since upper bound is non inclusive
    li = lines[ind:ind+4]
    print(li)
    ['Result', 'test1 : 12345', 'test2 : 23453', 'test3 : 2345454']

or as exercise with regex: 

import re  
with open('data', 'r') as f:

    text = f.read()
    # regex assumes that data as shown, ie, no blank lines between 'Result'
    # and the last needed line.
    mo =  re.search(r'Result(.*?\n){4}', text, re.MULTILINE|re.DOTALL)

    print(mo.group(0))

Result

test1 : 12345

test2 : 23453

test3 : 2345454

Upvotes: 0

Jon Clements
Jon Clements

Reputation: 142106

First you need to check that the text is in the line (not in the fileobj f), and you can utilise islice to take the next 3 lines from f and print them, eg:

from itertools import islice

with open(filename) as f:
    for line in f:
        if 'Result' in line:
            print(''.join(islice(f, 3)))

The loop will continue from the line after the three printed. If you don't want that - put a break inside the if.

Upvotes: 5

Andrew
Andrew

Reputation: 986

It is waiting for the first "Result" in the file and then prints the rest of the input:

import re, sys

bool = False
with open("input.txt", 'r+') as f:
    for line in f:
        if bool == True:
            sys.stdout.write(line)
        if re.search("Result",line):    #if it should match whole line, than it is also possible if "Result\n" == line: 
            bool = True

If you want end after first 3 prints, you may add variable cnt = 0 and change this part of code (for example this way):

        if bool == True:
            sys.stdout.write(line)
            cnt = cnt+1
            if cnt == 3:
                break

Upvotes: 0

Related Questions