рекурсивный grep с использованием Python - PullRequest
4 голосов
/ 10 августа 2011

Я новичок в Python и пытаюсь учиться. Я пытаюсь реализовать простой рекурсивный grep с использованием Python для обработки, и вот что я дошел до этого.

p = subprocess.Popen('find . -name [ch]', shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
  for line in p.stdout.readlines():
    q = subprocess.Popen('grep searchstring %s', line, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
    print q.stdout.readlines()

Может кто-нибудь сказать мне, как это исправить, чтобы сделать то, что он должен?

Ответы [ 3 ]

10 голосов
/ 10 августа 2011

Вы должны использовать функцию os.walk для просмотра ваших файлов.Используйте строковые методы или регулярные выражения для фильтрации результатов.Проверьте http://docs.python.org/library/os.html для получения информации о том, как использовать os.walk.

import os
import re

def findfiles(path, regex):
    regObj = re.compile(regex)
    res = []
    for root, dirs, fnames in os.walk(path):
        for fname in fnames:
            if regObj.match(fname):
                res.append(os.path.join(root, fname))
    return res

print findfiles('.', r'my?(reg|ex)')

Теперь для части grep вы можете зациклить файл с помощью функции open

def grep(filepath, regex):
    regObj = re.compile(regex)
    res = []
    with open(filepath) as f:
        for line in f:
            if regObj.match(line):
                res.append(line)
    return res

Если вы хотите получить номера строк, вы можете обратиться к функции enumerate.

отредактировано для добавления функции grep

0 голосов
/ 10 августа 2011

Может быть, вам может помочь пример, команда find . -print | grep "python" эквивалентна этой:

import subprocess

pc1 = subprocess.Popen('find . -print', stdout=subprocess.PIPE, shell=True)
pc2 = subprocess.Popen('grep "python"', stdin=pc1.stdout, shell=True,
                       stdout=subprocess.PIPE)

print pc2.communicate()[0]
0 голосов
/ 10 августа 2011
p = subprocess.Popen('find . -name [ch]', shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
  for line in p.stdout.readlines():
    q = subprocess.Popen('grep searchstring %s', line, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
    print q.stdout.readlines()
  1. Отступ в строке 2 будет исключением, for необходимо выровнять с p выше
  2. 'grep searchstring %s', line не будет выполнять замену строки, вам нужно заменить , на %

С этими изменениями и реальными поисковыми значениями он работает на моем OS X box. Окончательный сценарий:

import subprocess
p = subprocess.Popen('find . -name *.py', shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
for line in p.stdout.readlines():
    print line
    q = subprocess.Popen('grep import %s' % line, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
    print q.stdout.readlines()
...