2012-02-14 6 views
1

私は仕事のための小さなプログラムに取り組んでいます。Python文字列を検索してファイルを印刷しています

私がしようとしているのは、ユーザーが検索するために文字列を入力できるようにすることです。プログラムは定義されたディレクトリ内の複数の.txtファイルを検索し、その結果を出力するか、デフォルトのテキストエディタを使用して.txtファイルを開きます。

誰かがこの検索機能の正しい方向を指してくれますか?

ありがとうございます!

編集: これは私がこれまで持っているものです。このプログラムはWindowsとOSX上で動作するので、grepは使えません。私はまだ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

あなたの答えにヒントです:)

あなたは、ファイルを開くためにsubprocessモジュールを使用して、ファイル内の文字列を検索し、指定されたディレクトリ構造内のすべてのファイルを横断するos.walkを使用することができます必要なエディタ...

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"を検索しようとすると "nicholas"に一致しますが、 "Hola"には一致しません(後者の場合、line.lower()メソッドを追加できます)。

あなたが開始する可能性のある方法を示し始めただし、グレップを使用してくださいしてください

乾杯を

サンプル実行(私は「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)' 
関連する問題