2011-03-01 14 views
9

Hala Python'da (2.6 kullanarak) yeni yaşıyorum ve bir dosya için kapsamlı arama yapmayı deniyorum. sadece dosya adı kullanılabilir ve pencerelerdeki mutlak yolu döndürür. Ben scriptutil.py gibi bazı modülleri araştırdım ve buldum ve os modülünü inceledim ama ihtiyaçlara uyan herhangi bir şey bulamadım (ya da ihtiyacım olana uygulayabilmek için her şeyi doğru bir şekilde anlayamamış olabilirim ve bu yüzden herhangi bir kodu). Herhangi bir yardım için minnettar olurum.Python: Sadece dosya adı (yol değil) kullanılabilir olduğunda bir dosya için sistem genelinde arama nasıl yapılır

Teşekkürler.

cevap

15

os.walk() işlevi bunu yapmanın bir yoludur.

import os 
from os.path import join 

lookfor = "python.exe" 
for root, dirs, files in os.walk('C:\\'): 
    print "searching", root 
    if lookfor in files: 
     print "found: %s" % join(root, lookfor) 
     break 
+1

Martin Taş Evet öyle, ama (eğer doğru anlamak) o – ldmvcd

+0

@ldmvcd, onu başlaması söyleyebilir dizinden yinelemeli arama yapan bir yolunu gerektirir, yoksa Aramaları yalnızca geçerli çalışma dizinidir @ –

+0

@Martin Stone ** break ** kaldırılmalıdır, çünkü farklı dizinlerde aynı ada sahip birkaç dosya olabilir – eyquem

4

Sen kök dizinde başlar ve yinelemeli dosya için her düzeyde bakarak dizin yapısını yürüyebiliyordu. Elbette tüm sisteminizi aramak istiyorsanız, her bir sürücü için bunu çağırmanız gerekecektir.

os.path.walk(rootdir,f,arg) 

benzer bir soruya here için iyi bir cevap ve bu işi gibi başka bir here

+0

Linkler için teşekkürler, onlar yukarıda belirtilen cevap gibi yardımcı oldular. – ldmvcd

+0

3 argüman gerektiren 'os.path.walk' kullanıldığında, Python 2.3'den (ve 3.0'da tamamen kaldırılmıştır), yalnızca 1 argümanı gerektiren (ve 3 isteğe bağlı) olan' os.walk' lehine kullanılmamıştır. – ArtOfWarfare

0

misiniz şey var?

import os 
import sys 
import magic 
import time 
import fnmatch 

class FileInfo(object): 

    def __init__(self, filepath): 
     self.depth = filepath.strip('/').count('/') 
     self.is_file = os.path.isfile(filepath) 
     self.is_dir = os.path.isdir(filepath) 
     self.is_link = os.path.islink(filepath) 
     self.size = os.path.getsize(filepath) 
     self.meta = magic.from_file(filepath).lower() 
     self.mime = magic.from_file(filepath, mime=True) 
     self.filepath = filepath 


    def match(self, exp): 
     return fnmatch.fnmatch(self.filepath, exp) 

    def readfile(self): 
     if self.is_file: 
      with open(self.filepath, 'r') as _file: 
       return _file.read() 

    def __str__(self): 
     return str(self.__dict__) 



def get_files(root): 

    for root, dirs, files in os.walk(root): 

     for directory in dirs: 
      for filename in directory: 
       filename = os.path.join(root, filename) 
       if os.path.isfile(filename) or os.path.isdir(filename): 
        yield FileInfo(filename) 

     for filename in files: 
      filename = os.path.join(root, filename) 
      if os.path.isfile(filename) or os.path.isdir(filename):    
       yield FileInfo(filename) 


for this in get_files('/home/ricky/Code/Python'): 
    if this.match('*.py'): 
     print this.filepath 
İlgili konular