Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Using grep in python

Tags:

python

grep

There is a file (query.txt) which has some keywords/phrases which are to be matched with other files using grep. The last three lines of the following code are working perfectly but when the same command is used inside the while loop it goes into an infinite loop or something(ie doesn't respond).

import os

f=open('query.txt','r')
b=f.readline()
while b:
    cmd='grep %s my2.txt'%b    #my2 is the file in which we are looking for b
    os.system(cmd)
    b=f.readline()
f.close()

a='He is'
cmd='grep %s my2.txt'%a
os.system(cmd)
like image 746
user1171232 Avatar asked Jan 26 '12 12:01

user1171232


2 Answers

First of all, you are not iterating over the file properly. You can simply use for b in f: without the .readline() stuff.

Then your code will blow in your face as soon as the filename contains any characters which have a special meaning in the shell. Use subprocess.call instead of os.system() and pass an argument list.

Here's a fixed version:

import os
import subprocess
with open('query.txt', 'r') as f:
    for line in f:
        line = line.rstrip() # remove trailing whitespace such as '\n'
        subprocess.call(['/bin/grep', line, 'my2.txt'])

However, you can improve your code even more by not calling grep at all. Read my2.txt to a string instead and then use the re module to perform the search. In case you do not need a regex at all, you can even simply use if line in my2_content

like image 195
ThiefMaster Avatar answered Oct 07 '22 10:10

ThiefMaster


Your code scans the whole my2.txt file for each query in query.txt.

You want to:

  1. read all queries into a list
  2. iterate once over all lines of the text file and check each file against all queries.

Try this code:

with open('query.txt','r') as f:
    queries = [l.strip() for l in f]

with open('my2.txt','r') as f:
    for line in f:
        for query in queries:
            if query in line:
                print query, line
like image 33
eumiro Avatar answered Oct 07 '22 09:10

eumiro