Este es un programita (escrito en python) buscador de archivos que guarda el resultado de la búsqueda en un archivo de texto (.txt). Este programa surgió debido a que un día tube la necesidad de averiguar cuantos y cuales archivos con extención ".upf" existían en una maquina de SMT. Puede serle útil a alguna otra persona. Creo que el programa se expica por si mismo.
Lo modifiqué un poco para que pudieses buscar mas nombres o extenciones, separando cada uno por una coma. Al terminar la búsqueda, muestra en la barra de estado cuantos archivos encontró.
El código fuente fué probado con python 3.7 (Requiere wxpython).
import wx
from os import walk
from os import getcwd
class MyFrame(wx.Frame):
def __init__(self, parent, title ="Listador de archivos"):
super().__init__(parent, title = title , size = (600,240))
self.SetMinSize(size = (600,240)) #Set minimum size to current
self.locale = wx.Locale(wx.LANGUAGE_ENGLISH) # Fix locale unknown error
self.Dir = getcwd() #directorio por defecto
self.DirSve = getcwd()+"\DefaultName.txt" #directorio por defecto
#--------------------------------------------------
# Widgets
#---------------------------------------------------
self.CreateStatusBar()
self.SetStatusText("")
panel = wx.Panel(self, wx.ID_ANY)
BtnDirSrch = wx.Button(panel, label="Dir. Busqueda")
self.TxtDirSrch = wx.TextCtrl( panel, wx.ID_ANY, wx.EmptyString, wx.DefaultPosition, wx.DefaultSize, 0 )
self.TxtDirSrch.SetEditable(False)
self.TxtDirSrch.SetValue(self.Dir)
BtnDirRes = wx.Button(panel, label="Dir. Guardar")
self.TxtDirRes = wx.TextCtrl( panel, wx.ID_ANY, wx.EmptyString, wx.DefaultPosition, wx.DefaultSize, 0 )
self.TxtDirRes.SetEditable(False)
self.TxtDirRes.SetValue(self.DirSve)
self.TxtFleToSrch = wx.TextCtrl( panel, wx.ID_ANY, wx.EmptyString, wx.DefaultPosition, wx.DefaultSize, 0 )
self.TxtFleToSrch.SetEditable(True)
LblNombre = wx.StaticText(panel)
LblNombre.SetLabel("extencion o nombre")
BtnProcesar = wx.Button(panel, label="Buscar y crear lista (txt)")
#--------------------------------------------------
# BINDS
#--------------------------------------------------
BtnProcesar.Bind(wx.EVT_BUTTON, self.onSearch )
BtnDirSrch .Bind(wx.EVT_BUTTON, self.onDirSrch)
BtnDirRes .Bind(wx.EVT_BUTTON, self.onDirSve )
#--------------------------------------------------
# LAYOUT
#--------------------------------------------------
MainSizer = wx.BoxSizer(wx.VERTICAL)
sizrGrid = wx.FlexGridSizer(rows=3, cols=2, hgap=5, vgap=5)
sizrGrid.AddGrowableCol(1, 1)
sizrGrid.Add(BtnDirSrch, 0, wx.CENTER)
sizrGrid.Add(self.TxtDirSrch, 1, wx.CENTER|wx.EXPAND)
sizrGrid.Add(BtnDirRes, 0, wx.CENTER)
sizrGrid.Add(self.TxtDirRes, 1, wx.ALL|wx.CENTER|wx.EXPAND)
sizrGrid.Add(LblNombre, 0, wx.CENTER)
sizrGrid.Add(self.TxtFleToSrch, 0, wx.CENTER|wx.EXPAND)
MainSizer.Add(sizrGrid, 0,wx.ALL|wx.EXPAND, 5)
MainSizer.Add(BtnProcesar, 1,wx.ALL|wx.EXPAND,5)
panel.SetSizer(MainSizer)
def cleanText(self):
#-------------------------------------------
# Palabras no necesarias
#-------------------------------------------
quitar = ['', #en blanco
'de',
'del',
'el',
'la',
'los',
'las',
'y',
'en',
'con',
'para',
'por',
'a',
'desde',
'hacia',
'excepto',
'entre',
'sin',
'sobre',
'tras',
'contra',
'hasta',
'durante',
'mediante',
'también',
'tambien']
FindValue = self.TxtFleToSrch.GetValue() # obtener texto
#----------------------------------------------
# Tokenizar
#----------------------------------------------
FindValue = FindValue.replace(" ",",")
words = FindValue.split(',')
for x in quitar:
while x in words: # quitar de la lista palaras inesesarias
words.remove(x)
return words
def onSearch (self, event):
DirValuesFound = []
List = self.cleanText()
GetBusy = wx.BusyInfo("Procesandio, por favor espere", self) #Mostrar Leyenda (ocupado)
for root, dirs, files in walk(self.Dir):
for file in files:
for value in List:
if str(file).find(value) != -1:
#----- Revisar radio buttons ------
DirValuesFound.append(root+'/'+str(file)) # Direccion completa
file = open(self.DirSve,'w')
for x in DirValuesFound:
file.write(x+"\n")
file.close()
self.SetStatusText("Se encontraron " + str(len(DirValuesFound))+ " archivos.")
del GetBusy # quitar leyenda (ocupado)
def onDirSrch(self, event):
dlg = wx.DirDialog(self, "Elegir directorio de busqueda:",
style=wx.DD_DEFAULT_STYLE
#| wx.DD_DIR_MUST_EXIST
#| wx.DD_CHANGE_DIR
)
if dlg.ShowModal() == wx.ID_OK:
self.Dir = dlg.GetPath()
self.TxtDirSrch.SetValue(self.Dir)
dlg.Destroy()
def onDirSve(self, event):
wildcard = "Text Files (*.txt)|*.txt"
dlg = wx.FileDialog(
self, message="Elegir dereccion y numbre",
defaultDir=self.DirSve,
defaultFile="", wildcard=wildcard, style=wx.FD_SAVE
)
if dlg.ShowModal() == wx.ID_OK:
self.DirSve = dlg.GetPath()
self.TxtDirRes.SetValue(self.DirSve)
dlg.Destroy()
app = wx.App(0)
frame = MyFrame(None)
app.SetTopWindow(frame)
frame.Show()
app.MainLoop()