I'm writing a command-line application and I want to search through lots
of text files for a string.  Instead of writing the python code to do
this, I want to use grep.

This is the command I want to run:

$ grep -l foo dir

In other words, I want to list all files in the directory dir that
contain the string "foo".

I'm looking for the "one obvious way to do it" and instead I found no
consensus.  I could os.popen, commands.getstatusoutput, the subprocess
module, backticks, etc.

While it doesn't use grep or external processes, I'd just do it in pure Python:

  def files_containing(location, search_term):
    for fname in os.listdir(location):
      fullpath = os.path.join(location, fname)
      if os.isfile(fullpath):
        for line in file(fullpath):
          if search_term in line:
            yield fname
            break
  for fname in files_containing('/tmp', 'term'):
    print fname

It's fairly readable, you can easily tweak the search methods (case sensitive, etc), change it to be recursive by using os.walk() instead of listdir(), it's cross-platform, and doesn't require the overhead of an external process (along with the "which call do I use to spawn the function" questions that come with it :)

However, to answer your original question, I'd use os.popen which is the one I see suggested most frequently.

-tkc



--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to