Python ищет строку и печатает файл, в котором она находится - PullRequest
1 голос
/ 14 февраля 2012

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

Я пытаюсь разрешить пользователю вводить строку для поиска.Программа будет искать строку в нескольких файлах .txt в определенной директории, а затем либо распечатывает результат, либо открывает файл .txt с помощью текстового редактора по умолчанию.

Может кто-нибудь указать мне правильное направление для этой функции поиска?

Заранее спасибо!

Редактировать: Это то, что я до сих пор.Я не могу использовать grep, так как эта программа будет работать как на Windows, так и на OSX.Я еще не тестировал Windows, но в OSX мои результаты запрещены.

import os
    import subprocess

    text = str(raw_input("Enter the text you want to search for: "))

    thedir = './f'
    for file in os.listdir(thedir):
        document = os.path.join(thedir, file)
        for line in open(document):
            if text in line:
                subpocess.call(document, shell=True)

Ответы [ 3 ]

4 голосов
/ 14 февраля 2012

Есть гораздо лучшие инструменты для этого (было упомянуто 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)'
2 голосов
/ 14 февраля 2012

ниже - подсказки к вашему ответу:)

Вы можете использовать os.walk для просмотра всех файлов в указанной структуре каталогов, поиска строки в файле, использования модуля subprocess для открытия файлав нужном редакторе ...

0 голосов
/ 14 февраля 2012
import os
import subprocess

text = str(raw_input("Enter the text you want to search for: "))

thedir = 'C:\\your\\path\\here\\'
for file in os.listdir(thedir):
    filepath = thedir + file
    for line in open(filepath):
        if text in line:
            subprocess.call(filepath, shell=True)
            break
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...