2012-03-14 8 views
0

ディレクトリツリー内のファイルのリストを検索しようとしています。本質的に、私は検索するすべての用語(〜500)をテキストファイルに提供し、ディレクトリとサブディレクトリで検索します。しかし、私はすべてのフォルダを検索することなく、コードが取り込んで早期に終了するステップには問題があります。Pyフォルダとサブフォルダ内のファイルを検索する

私が使用しているコードは(patternは、テキストファイルの名前です)です:

import os 

def locateA(pattern, root): 
    file = open(pattern, 'r') 
    for path, dirs, files in os.walk(root): 
     for word in files: 
      for line in file: 
       if line.strip() in word: 
        print os.path.join(path, word), line.strip() 

任意のアイデア私が間違ってるどこに?

+1

私はFとしてオープン(パターン「のrU」)を有する構築物を '使用することをお勧め:' 'とあなたのファイルを呼び出すことはありませんが'file'は組み込みモジュールのクラスであるためです。 – hochl

+0

ファイルの名前を別のものに変更しました。私はあなたが言及したconstrutを調査します。 – Andres

+0

問題の症状はどういうものですか? –

答えて

1

file.seek()を使用してファイル内の現在の位置をリセットしない限り、ファイルを一度しか反復できないことが問題の全部または一部である可能性があります。

あなたは再びそれをループしようとする前に戻って、ファイルの先頭に求めていることを確認してください:

import os 

def locateA(pattern, root): 
    file = open(pattern, 'r') 
    for path, dirs, files in os.walk(root): 
     for word in files: 
      file.seek(0)    # this line is new 
      for line in file: 
       if line.strip() in word: 
        print os.path.join(path, word), line.strip() 
+0

ああ!、これは働いているようです。一度しか反復することができないことを知らなかった – Andres

+0

私の答えがあなたに役立つならば、問題ありません(http://meta.stackexchange.com/a/5235/155356)答えに。 –

0

for line in filefileの行最初の時間を消費し、その後のたびに空になっています。

ことや他のいくつかの問題が修正され、代わりにこれを試してみてください:

import os 

def locateA(pattern, root): 
    patterns = open(pattern, 'r').readlines() # patterns is now an array, no need to reread every time. 
    for path, dirs, files in os.walk(root): 
     for filename in files: 
      for pattern in patterns: 
       if pattern.strip() in filename: 
        print os.path.join(path, filename), pattern.strip() 
+0

簡単な質問ですが、コード内で 'filecontent = open(file、 'r')。read()'が必要なのはなぜですか?これはディレクトリ内のすべてのファイルを開きますか? – Andres

+0

申し訳ありませんが、私はあなたの質問を誤解し、各ファイルに 'grep'と同等のものを実行したいと思っていました。私は今あなたが実際にファイル名と一致しているのを見る。私はこの例を修正した。 –