[Tutor] python grep implementation

anish singh anish198519851985 at gmail.com
Thu Oct 13 02:52:11 EDT 2016


I am trying to implement grep functionality in python.

import os, sys, getopt
import multiprocessing as mp
import re
import itertools

def get_files(path, pattern):
  for (dirpath, dirnames, filenames) in os.walk(path):
    for filename in filenames:
      if filename.endswith(pattern):
        yield os.path.join(dirpath, filename)

def worker_search_fn(arg):
  fname, regex = arg
  with open(fname, 'rt') as f:
    match = regex.search(f.read())
    if match:
      print(fname + " " +":"+ match.group())
      return

def main(argv):
  path, f_pattern, s_pattern = '', '', ''
  try:
     opts, args =
getopt.getopt(argv,"hi:p:f:s:S:",["ifile=","file_pattern=","string_pattern=","string_flags="])
  except getopt.GetoptError:
     print 'test.py -i <path> -p <pattern> -f <file_name1, file_name2 ...>
-S <python flags>'
     print 'example usage python a.py -i . -s \'.*_i2c_register.*\' -f
.c,.h,.cpp -S "S"'
     sys.exit(2)
  for opt, arg in opts:
     if opt == '-h':
        print 'test.py -i <path> -p <pattern>, -f <file_name1, file_name2
...>'
        sys.exit()
     elif opt in ("-i", "--ifile"):
        path = arg
     elif opt in ("-f", "--file_pattern"):
        f_pattern = arg.split(",")
     elif opt in ("-s", "--string_pattern"):
        s_pattern = arg
     elif opt in ("-S", "--string_flags"):
        s_pattern_flags = arg

  regex = re.compile(s_pattern, getattr(re, s_pattern_flags))
  files = get_files(path, tuple(f_pattern))
  mp.Pool().map(worker_search_fn, itertools.izip(files,
itertools.repeat(regex)))

if __name__ == "__main__":
  main(sys.argv[1:])


I want to see if I can further speedup in any way possible and also some
code review.


More information about the Tutor mailing list