Looking for a string in text file with python

195 Views Asked by At

I'm trying to look for a string in text file. Technically, my code supposed to work, I was define a key to search, which is the string I'm looking for and I checked the whole file line after line.

When I'm running the code, somehow the code always go to except case although the results suppose to be "True"

This is my code:

def check_if_image_at_end_selected():
    with open('Sanity_CS.txt', 'r') as checked_script:

        key = "MillSet_BBs.set_image_at_end('yes')"

        for num, line in enumerate(checked_script, 1):
            if key in line:
                print("OK")
                return 1
            else:
                print("no")
                return 0

3

There are 3 best solutions below

0
buhtz On BEST ANSWER

I can not see why you use enumerate() in your example. The resulting num variable is never used. So I assume the line number is not of interested right?

Because of that I removed that part from the code. I replaced the open() with a io.StringIO just for that example code because we don't have a real file here.

#!/usr/bin/env python3
import io

simulated_file_content = "lineA\nMillSet_BBs.set_image_at_end('yes')\nline3"

def check_if_image_at_end_selected():
    # io.StringIO just for simulating a file
    with io.StringIO(simulated_file_content) as checked_script:
        key = "MillSet_BBs.set_image_at_end('yes')"

        # read whole file at once
        file_content = checked_script.read()

        if key in file_content:
            print("OK")
            return True
        else:
            print("no")
            return False

result = check_if_image_at_end_selected()
print(result)

The code just read the whole file at once as one string and then does a simple string search. Nothing more.

You don't have to close() the file object your self. This is done automatically (by the ContextManager) when you use the with block.

If you don't want to read the whole file at once because it is a very big file you can do a line by line read-and-search like this:

#!/usr/bin/env python3
import io

simulated_file_content = "lineA\nMillSet_BBs.set_image_at_end('yes')\nline3"

def check_if_image_at_end_selected():
    # io.StringIO just for simulating a file
    with io.StringIO(simulated_file_content) as checked_script:
        key = "MillSet_BBs.set_image_at_end('yes')"

        # read line by line
        for line in checked_script.readline():
            if key == line:
                print("OK")
                return True

    print("no")
    return False

result = check_if_image_at_end_selected()
print(result)
0
Bora Varol On

When you use with as, you need to tab the next lines, it's just like an if statement. And you don't need to manually close the file after

0
Anentropic On

Apart from other stuff mentioned in the comments, the problem is here:

for num, line in enumerate(checked_script, 1):
    if key in line:
        print("OK")
        return 1
    else:
        print("no")
        return 0

If the key is not found in the first line of the file then it will return 0 and not continue with the rest of the loop.

We can just do this:

for num, line in enumerate(checked_script, 1):
    if key in line:
        print("OK")
        return 1
print("no")
return 0

I.e. if the code gets to the end of the for loop without returning (or breaking) early then the key wasn't found in any of the lines.