2012-02-14 2 views
1

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

Что я пытаюсь сделать, так это разрешить пользователю вводить строку для поиска. Программа будет искать несколько файлов .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) 
+2

Звучит как работа для grep. –

ответ

2

ниже намеки на ваш ответ :)

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

0
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 
+0

Я немного изменил работу с моей работой и, похоже, он работает, не имея возможности запускать подпроцесс. Я считаю, что это связано с тем, что я работаю на OSX, и если я правильно помню, что что-то нужно импортировать для работы с OSX, но я не помню, что это было. –

4

есть гораздо более эффективные инструменты, чтобы сделать это (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», он будет соответствовать «nola», но не «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)' 
Смежные вопросы