Código de Python - Clase para buscar una carpeta o un archivo y mostrar el contenido

Imágen de perfil

Clase para buscar una carpeta o un archivo y mostrar el contenidográfica de visualizaciones


Python

estrellaestrellaestrellaestrellaestrella(1)
Publicado el 15 de Mayo del 2017 por kip
3.736 visualizaciones desde el 15 de Mayo del 2017. Una media de 63 por semana
Una clase que busca una carpeta o un archivo en el directorio dado, por defecto busca en el directorio raiz /.

Ejemplo:

Instanciamos el objeto enviandole como parametros el tipo de busqueda a realizar y el directorio


1
finder = Finder('folder', '/')


Para hacer una busqueda insensible a mayusculas y minusculas, enviar como tercer parametro al momento de instanciar la clase un True:


1
finder = Finder('folder', './', True)

O simplemente luego de hacer la instancia acceder a a propiedad caseIns y darle el valor de True:

1
finder.caseIns = True

Luego llamamos al metodo find() enviandole la carpeta a buscar y luego llamamos al metodo showAll() para mostrar las coincidencias encontradas

1
finder.find('carpeta').showAll()

Puede usarse una expresion regular como parametro al metodo de busqueda, recordar que se debe enviar un True como segundo parametro para que la busqueda con la expresion funcione

1
finder.find('^carpeta$', True).showAll()

Si la busqueda esta tardando mucho, es posible cancelarla y dejar que muestre los resultados encontrados hasta el momento, CTRL + C y detendras la busqueda.

El metodo showAll() mostrara un listado de todas las coincidencias con un numero para luego poder seleccionar alguna entre ellas y mostrar su contenido.

Para mostrarlo podria hacerse asi, usando el metodo show():

1
2
op = input("Eliga una opcion de la lista anterior para mostrar el contenido: ")
finder.show(op)

Se envia como parametro el numero ingresado, luego mostrara el contenido de la carpeta selecionada o del archivo.

Al final la consola mostraria algo asi luego de ejecutar todo el codigo anterior:

1
2
3
4
5
6
7
8
9
10
11
Buscando........
Coincidencias: 1
[0] - './txt'
Eliga una opcion de la lista anterior para mostrar el contenido: 0
 
-> 3 archivos en el directorio seleccionado './txt'
-> Mostrando el contenido:
 
a.txt
b.txt
nuevo.txt

Para verificar que se encontraron coincidencias y asi poder pedir algun numero correspondiente a alguna de estas, se debe acceder a la propiedad matches y verificar el tamaño de esta:

1
2
if (len(finder.matches) > 1):
    #PIDO EL NUMERO DE ALGUNA COINCIDENCIA

La clase es sencilla, usa la palara reservada para retornar un generador y asi aligerar un poco la busqueda al momento de iterar los directorios.

https://wiki.python.org/moin/Generators

Aqui dejo el codigo de ejemplo de uso:

Busqueda de una carpeta

1
2
3
4
5
finder = Finder('folder', './', True)
finder.find('carpeta').showAll()
if (len(finder.matches) > 1):
    op = input("Eliga una opcion de la lista anterior para mostrar el contenido: ")
    finder.show(op)

Busqueda de un archivo

1
2
3
4
5
finder = Finder('file', './', True)
finder.find('archivo.txt').showAll()
if (len(finder.matches) > 1):
    op = input("Eliga una opcion de la lista anterior para mostrar el contenido del archivo: ")
    finder.show(op)

Requerimientos

Python 2.7
Python 3.X

1.0
estrellaestrellaestrellaestrellaestrella(1)

Actualizado el 23 de Julio del 2017 (Publicado el 15 de Mayo del 2017)gráfica de visualizaciones de la versión: 1.0
3.737 visualizaciones desde el 15 de Mayo del 2017. Una media de 63 por semana
estrellaestrellaestrellaestrellaestrella
estrellaestrellaestrellaestrella
estrellaestrellaestrella
estrellaestrella
estrella

Cualquier error comentarlo.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
import os
import re
 
class Finder:
 
    matches = []
 
    def __init__(self, type = None, path = '/', caseIns = False):
        self.type = type
        self.path = path
        self.caseIns = caseIns
 
    def __list(self):
        for wPath in os.walk(self.path):
            yield wPath
 
    def __listFolders(self):
        for basepath, dirs, files in self.__list():
            for name in dirs:
                yield os.path.join(basepath, name)
 
    def __listFiles(self):
        for basepath, dirs, files in self.__list():
            for name in files:
                yield os.path.join(basepath, name)
 
    def __find(self, generator, regex):
        if regex:
            flag = 0
            if self.caseIns:
                flag = re.IGNORECASE
            for path in generator:
                if re.search(r'' + self.needle, path, flag):
                    self.matches.append(path)
        else:
            if (self.caseIns):
                for path in generator:
                    temppath = path.lower()
                    if temppath.endswith(self.needle.lower()):
                        self.matches.append(path)
            else:
                for path in generator:
                    if path.endswith(self.needle):
                        self.matches.append(path)
 
    def find(self, needle, regex = False):
        if self.type == None:
            raise Exception("Debes especificar un tipo de archivo a buscar")
        print ("Buscando........ ")
        try:
            self.needle = needle
            if self.type.upper() == 'FOLDER':
                self.__find(self.__listFolders(), regex)
            elif self.type.upper() == 'FILE':
                self.__find(self.__listFiles(), regex)
        except KeyboardInterrupt:
            return self
        return self
 
    def showAll(self):
        if len(self.matches) > 0:
            matches = lambda: [(yield num, match) for num, match in enumerate(self.matches)]
            print("Coincidencias: %s" % len(self.matches))
            for num, match in matches():
                print("[%d] - '%s'" % (num, match))
        else:
            print("No se encontraron coincidencias")
 
    def show(self, option):
        if len(self.matches) > 0:
            pathOrFile = self.matches[option]
            line = "-" * 150
            if os.path.isdir(pathOrFile):
                content = [os.path.relpath(content) for content in os.listdir(pathOrFile)]
                print("\n-> %d archivos en el directorio seleccionado '%s'\n-> Mostrando el contenido:\n" % (len(content), pathOrFile))
                print ("%s\n" % "\n".join(content))
            elif os.path.isfile(pathOrFile):
                print("\nMostrando contenido del archivo '%s':\n" % pathOrFile)
                print(line)
                with open(pathOrFile, 'r') as file:
                    print file.read()
                print(line)
                print("\nFin de archivo")
        else:
            print("No se encontraron coincidencias")



Comentarios sobre la versión: 1.0 (1)

Imágen de perfil
xve
15 de Mayo del 2017
estrellaestrellaestrellaestrellaestrella
Excelente kip!!!
Responder

Comentar la versión: 1.0

Nombre
Correo (no se visualiza en la web)
Valoración
Comentarios
Es necesario revisar y aceptar las políticas de privacidad

http://lwp-l.com/s3994  
Revisar política de publicidad