2012-10-25 14 views
6

Io lavoro con python e ho bisogno di una funzione o di una libreria che cerchi i miei file in tutte le unità, che gli dia solo il nome di file come F3 in Windows che cerca su tutte le cartelle nel computer. sistema operativo Windows, le unità locali ,, scrivo un codice dicerca file in tutte le unità usando 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); 

mi danno un buon risultato, ma un certo tipo è darmi un errore, se non ho bisogno di cercare in un file .zip o .RAR come Posso farlo

+1

Si prega di provare prima da soli, quindi chiedere eventuali problemi particolari che non è stato possibile superare. – manas

+0

Potresti essere più preciso sulle tue esigenze, qual è il tuo sistema operativo, cosa intendi per * tutte le unità *: tutte le unità locali, dischi condivisi di rete? – FabienAndre

+0

@silent_warrior vedi modifica domanda –

risposta

6

Su Windows, si sarà migliore di utilizzare la funzione os.walk. os.walk restituisce un generatore che percorre in modo ricorsivo l'albero dei sorgenti. L'esempio seguente mostra una ricerca di espressioni regolari.

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

Alcune note:

  1. sto usando un'espressione regolare per la ricerca del file. Per questo, sto compilando il RE prima del tempo e lo passo come argomenti. Ricordarsi di normalizzare l'espressione, specialmente se il nome del file proviene da un utente malintenzionato.
  2. win32api.GetLogicalDriveStrings restituiscono una stringa con tutti i driver, separati da 0. divisa, e poi affettare l'ultimo elemento
  3. Durante la passeggiata, è possibile rimuovere dalle cartelle temuto 'dirs' come '.git' o ' .cvs'. Vedi os.walk. doc per esempio.
  4. Per mantenere l'esempio breve, non ho propagato "trovato". Rimuovi l'interruzione se vuoi stampare tutti i file. Propaga la 'interruzione' per trovare_file_in_all_drivers se vuoi fermarti dopo aver trovato il primo file.
+1

+1 per 'win32api.GetLogicalDriveStrings()'. – glglgl

+0

buona risposta, funziona molto bene –

+0

@Uri: ho una piccola domanda sul codice, non mi dà tutti i risultati, qual è la ragione? –

1

È necessario specificare le unità ad esempio per l'unità c.

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 

Fondamentalmente si attraversa l'albero dei file. Devi passare le unità a questo metodo come directory principale. per esempio. findall ('c: /')

+1

grazie ma {os.path.isdir (directory + '/' + fl)} non funziona esattamente –

+0

@ D.Jo Perché e come no? – glglgl

+0

@specialscope Aggiunge un 'path = os.path.join (directory, fl)' dopo la riga 'for' e sostituisce tutte le directory' + '/' + fl'with '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() 
Problemi correlati