buscar archivos en todas las unidades usando Python

Trabajo con python y necesito una función o biblioteca que busque mis archivos en todas las unidades, que le de el nombre de F3 en Windows que busque en todas las carpetas en la computadora. Windows OS, unidades locales, escribo un código

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

Dame un buen resultado, pero algún tipo es Dame un error, si no necesito buscar en un archivo .Zip o .RAR, ¿cómo puedo hacer eso?

En Windows, será mejor que uses la función os.walk . os.walk devuelve un generador que recursivamente recorre el árbol de origen. El siguiente ejemplo muestra una búsqueda de expresiones regulares.

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

Algunas notas:

  1. Estoy usando una expresión regular para buscar el archivo. Para esto, estoy comstackndo la ER antes de tiempo, y la paso como argumentos. Recuerde normalizar la expresión, especialmente si el nombre del archivo proviene de un usuario malintencionado.
  2. win32api.GetLogicalDriveStrings devuelve una cadena con todos los controladores, separados por 0. divídalo y luego corte el último elemento
  3. Durante el recorrido, puede eliminar de ‘dirs’ las carpetas sin fecha, como ‘.git’ o ‘.cvs’. Ver os.walk. doc por ejemplo.
  4. Para mantener la muestra corta, no propagé ‘encontrado’. Elimine el ‘break’ si desea imprimir todos los archivos. Propague el ‘break’ a find_file_in_all_drivers si desea detenerse después de encontrar el primer archivo.
 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() 

Debe especificar unidades, por ejemplo, para la unidad 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 

Básicamente se atraviesa el árbol de archivos. Tienes que pasar unidades a este método, aunque como directorio raíz. p.ej. findall (‘c: /’)