2017-06-01 10 views
0

プログラムを検索する(ファイル、リスト)、検索するには、リスト内の単語を含むテキストを検索するそれをリストに入れて次の単語に移動します。それぞれの文書について、単語を見つけたら、「このファイルのディレクトリ」の中で「word [0]、word [1]、word [2]」と書かれた文章を印刷したいと思います。これまでに試したことは次の通りです:リスト内の単語を含むファイルをディレクトリから検索する

import os 

def search(file, list): 
    if list == []: 
     return 
    else: 
     if os.path.isfile(file): 
      try: 
       infile = open(file, 'r') 
       doc = infile.read() 
      except: 
       return 
      infile.close() 
      print ('Searching {}'.format(file)) 
      if list[0] in doc: 
       print('{} in {}'.format(list[0], file)) 
     elif os.path.isdir(file): 
      for item in os.listdir(file): 
       itempath = os.path.join(file, item) 
       search(itempath, list) 
    return search(file, list[1:]) 
+0

再帰呼び出し 'return search(itempath、list)'を返すのを忘れた – karthikr

+0

ありがとうございます、今すぐリストを実行するようにしましたが、プロンプトで追加の手順を忘れて今質問を更新しました – calculator2compiler

+0

単語を1つずつ見たい場合は、 'return search(file、list [1:])'を返すのではなく、リストを反復するだけで意味がありませんか? –

答えて

0

あなたが(ところで。あなたはビルトインタイプのシャドウイングしている、変数名としてfilelistを使用していない)あなたのlistを反復処理していない用語をチェックするために、あなたのような何かをする必要があると思います:

found_words = [] 
for word in list: 
    if word in doc: 
     found_words.append(word) 
if found_words: 
    print('{} in {}'.format(", ".join(found_words), file)) 

すべての語句を確認する場合は、代わりにしかし、あなたはこれを必要以上に複雑にしています。まず、os.walk()を使用して、すべてのサブディレクトリを再帰的に調べる必要があります。次に、メモリ内のファイル全体を読むのは良い考えではありません。平均的に検索が遅くなるだけでなく、大きなファイルに遭遇した瞬間に、メモリの問題が発生する可能性があります。

キーがファイルパスに設定されている辞書を返します。値は検出された用語です。あなたが現在のフォルダ内のファイルを検索していたのであれば、例えば、単語を(スクリプト用のフォルダを実行している)、「インポート」あなたがそれを行うことができます:

search_results = search("./", ["import, export"]) 
for key in search_results: 
    print("{} in {}".format(", ".join(search_results[key]), key) 

、それはあなたの望ましい結果を印刷する必要があります。また、ファイル拡張子/タイプのチェックを使用して、読めない/バイナリファイルを調べる時間を無駄にすることもありません。また、コーデック検査は、ファイルに応じて、その行を読むとUnicodeエラー(デコードのデフォルト)が発生する可能性があるため、順番に行う必要があります。要するに、改善の余地がたくさんあります...

また、単語を正確には探していませんが、渡された文字列が単なる存在であることに注意してください。たとえば、catを検索すると、caterpillarも含まれるファイルが返されます。また、時間のほんの一部でこれを行う専用のツールもあります。

関連する問題