2012-10-25 11 views
6

私はPythonを使用しています。すべてのドライブでファイルを検索する関数またはライブラリが必要です。ファイル名はF3となります。コンピュータで。 のWindows OSは、ローカルドライブは,,私はPythonを使用しているすべてのドライブの検索ファイル

import os 
import win32api 
paths = 'D:/' 
def dir_list_folder(paths): 
    for folderName in os.listdir(paths): 
     if (folderName.find('.') == -1): 
      folderPath = os.path.join(paths,folderName); 
      dir_list_folder(folderPath); 
     else: 
      print ('Files is :'+ folderName); 

が、それは私に良い結果を与えるのコードを記述しますが、いくつかの種類は、私が.ZIPまたは.RARどのファイルに検索する必要がない場合は、私にエラーを与えています私はそれを行うことができます

+1

ご自身でお試しください。克服できなかった問題があればお聞かせください。 – manas

+0

あなたのニーズをより正確に、あなたのOSは何か、*すべてのドライブ*:すべてのローカルドライブ、ネットワーク共有ディスクの意味はありますか? – FabienAndre

+0

@silent_warrior編集の質問を参照してください –

答えて

6

、あなたはos.walk機能を使用する方が良いでしょう。 os.walkは、ソースツリーを再帰的に歩くジェネレータを返します。次のサンプルは、正規表現の検索を示しています。

import os 
import re 
import win32api 

def find_file(root_folder, rex): 
    for root,dirs,files in os.walk(root_folder): 
     for f in files: 
      result = rex.search(f) 
      if result: 
       print os.path.join(root, f) 
       break # if you want to find only one 

def find_file_in_all_drives(file_name): 
    #create a regular expression for the file 
    rex = re.compile(file_name) 
    for drive in win32api.GetLogicalDriveStrings().split('\000')[:-1]: 
     find_file(drive, rex) 


find_file_in_all_drivers('myfile\.doc') 

いくつかの注意:

  1. 私は、ファイルを検索するための正規表現を使用しています。このために、私はREを前もってコンパイルして、引数として渡します。特にファイル名が悪意のあるユーザーのものである場合は、正規表現を忘れないようにしてください。
  2. win32api.GetLogicalDriveStringsは0で区切られたすべてのドライバとの文字列は、それを分割して、散歩中に最後の要素
  3. をスライス返し、あなたは、このような「.git」として「dirsに」unwatedフォルダから削除することができますか'.cvs' os.walkを参照してください。例えば、の文書
  4. サンプルを短く保つために、私は 'found'を伝播しませんでした。すべてのファイルを印刷する場合は、「中断」を削除します。最初のファイルが見つかった後に停止したい場合は、find_file_in_all_driversに 'break'を伝播してください。
+1

+1を検索しないでください。 – glglgl

+0

回答ありがとうございました、それはとてもうまく動作します –

+0

@ユリ:私はコードについて少し質問がありますが、それは私にすべての結果を与えてくれません、理由は何ですか? –

1

たとえば、ドライブのドライブを指定する必要があります。

def findall(directory): 
    files=os.listdir(directory) 
    for fl in files: 
     path=os.path.join(directory,fl) 
     if os.path.isdir(path): 
      findall(path) 
     else: 
      dosomethingwithfile(path) 
    return 

基本的には、ファイルツリーを走査します。ルートディレクトリとしてこの方法にドライブを渡す必要があります。例えば。 findAll( 'C:/')Windowsでは

+1

を参照してくださいありがとう、しかし、{os.path.isdir(ディレクトリ+ '/' + fl)}正確には動作しません –

+0

@ D.Joそれはどうですか? – glglgl

+0

@specialscope 'for'行の後に 'path = os.path.join(directory、fl)'を追加し、すべての 'directory + '/' + fl'を' path'で置き換えます。 – glglgl

1
import os 
az = lambda: (chr(i)+":\\" for i in range(ord("A"), ord("Z") + 1)) 
for drv in az(): 
    for root, dirs, files in os.walk(drv): 
     process_the_stuff() 
関連する問題