Python

2012-10-25 4 views
6

kullanarak tüm sürücülerdeki arama dosyaları Python ile çalışıyorum ve dosyaları tüm sürücülerde arayabilen bir işlev veya kitaplığa ihtiyacım var, bu dosyalara tüm dosyalarda arama yapan Windows'ta F3 dosyalarının adını verdim bilgisayarda. pencere os, yerel sürücüler ,, iPython

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); 

bana iyi bir sonuç verir bir kod yazmak ama bazı tip i .zip veya .rar nasıl dosya arama yapmak gerekmiyorsa, bana bir hata vermek Bunu

+1

Lütfen önce kendiniz deneyin, sonra üstesinden gelemeyeceğiniz herhangi bir sorun sorun. – manas

+0

İhtiyacınıza göre daha kesin olabilir misiniz, işletim sisteminiz nedir, tüm sürücülerle ne demek istiyorsunuz *: tüm yerel sürücüler, ağ paylaşımlı disk? – FabienAndre

+0

düzenlemek soru –

cevap

6

, sen os.walk fonksiyonunu kullanarak daha iyi olacaktır. os.walk, kaynak ağacını yinelemeli olarak yürüten bir jeneratörü döndürür. Aşağıdaki örnek düzenli bir ifade aramasını göstermektedir.

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') 

bazı notlar: Ben dosyayı arama için normal bir ifade kullanıyorum

  1. . Bunun için, RE'yi zamanın önünde derleyip argüman olarak aktarıyorum. İfadeyi normalleştirmeyi unutmayın - özellikle dosya adı kötü niyetli bir kullanıcıdan geliyorsa. , Bu tür '.git' veya 'dirs' unwated klasörlerden
  2. win32api.GetLogicalDriveStrings 0. bölünmüş o ile ayrılan tüm sürücülerin bir dize döndürür ve sonra yürüyüş sırasında son öğe
  3. kesmekistediğinde kaldırabilirsiniz ' .cvs'. Baksana. Örneğin, doc.
  4. Örneği kısa tutmak için 'bulunamadı' yaymadım. Tüm dosyaları yazdırmak istiyorsanız 'break' öğesini kaldırın. İlk dosyadan sonra durmak istiyorsanız find_file_in_all_drivers adresine 'break' yazın.
+1

1() ararsanız iyi klasörün içinde arama ama içeride de dosyaları aramak, durmalıdır'. – glglgl

+0

iyi bir cevap için teşekkürler, çok iyi çalışıyor –

+0

@Uri: Kodu hakkında biraz sorum var, bana tüm sonucu vermiyor, nedeni nedir? –

1

yapabilirim. Örneğin c sürücüsü için sürücüler belirtmeniz gerekir.

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 

Temelde dosya ağaç travers. Sürücüleri bu yönteme root kök olarak iletmelisiniz. Örneğin. findall ('c: /') Windows'ta

+1

sayesinde bkz @FabienAndre bkz @silent_warrior ancak {os.path.isdir (dizin + '/' + fl)} D.Jo Why @ tam –

+0

çalışmaz ve nasıl değil mi? – glglgl

+0

@specialscope 'for' hat sonra bir 'yol = os.path.join (dizin, fl) ekleyin ve bütün' dizin + '/' + fl'with 'path' değiştirin. – 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()