Есть гораздо лучшие инструменты для этого (было упомянуто grep
, и, вероятно, это лучший путь).
Теперь, если вам нужно решение Python (которое будет работать очень медленно), вы можете начать отсюда:
import os
def find(word):
def _find(path):
with open(path, "rb") as fp:
for n, line in enumerate(fp):
if word in line:
yield n+1, line
return _find
def search(word, start):
finder = find(word)
for root, dirs, files in os.walk(start):
for f in files:
path = os.path.join(root, f)
for line_number, line in finder(path):
yield path, line_number, line.strip()
if __name__ == "__main__":
import sys
if not len(sys.argv) == 3:
print("usage: word directory")
sys.exit(1)
word = sys.argv[1]
start = sys.argv[2]
for path, line_number, line in search(word, start):
print ("{0} matches in line {1}: '{2}'".format(path, line_number, line))
Пожалуйста, примите это с недоверием: оно не будет использовать регулярные выражения или вообще не будет умным. Например, если вы попытаетесь найти «hola», он будет соответствовать «nicholas», но не «Hola» (в последнем случае вы можете добавить метод line.lower ().
Опять же, это только начало, чтобы показать вам возможный способ начать. Тем не менее, пожалуйста, используйте grep.
Приветствие.
Пример запуска (я назвал этот скрипт "pygrep.py"; $
- это командная строка):
$python pygrep.py finder .
./pygrep.py matches in line 12: 'finder = find(word)'
./pygrep.py matches in line 16: 'for line_number, line in finder(path):'
./pygrep.py~ matches in line 11: 'finder = find(word)'