Script para buscar texto en archivos/rutas

761 views
Skip to first unread message

Ricardo Garcia

unread,
Mar 19, 2014, 3:32:31 PM3/19/14
to python-v...@googlegroups.com
Buenas tardes lista, mi nombre es Ricardo Garcia de Maracay y recien empecé la semana pasada con python.

Busco hacer un script que me permita encontrar "X cadena de texto" dentro de los archivos contenidos en una ruta dada (recursivamente). Y al final muestre un listado con las rutas completas de los archivos que conienen "X cadena de texto" y el numero de coincidencias totales. Cualquier consejo, ejemplo de código o referencia a las librerias que debo usar son bienvenidos.

Hasta ahora llevo èsto:

import os
import sys
print "El directorio actual es:", os.path.curdir
print " (y su ruta absoluta es):", os.path.abspath(os.path.curdir)
print ""
print "El script actual es:", file
print " (y su ruta es):", os.path.abspath(__file__), "\n"

if(len(sys.argv) > 2):
    if sys.argv[1]:
        print "Abriendo " + sys.argv[1]
        archivo = sys.argv[1]
        palabra = sys.argv[2]
        repetidas = 0
        f = open(sys.argv[1])
        lines = f.readlines()
        for line in lines:
            palabras = line.split(' ')
            for p in palabras:
                if p == palabra:
                    repetidas = repetidas + 1
        print "la palabra \"{0}\" se repite {1} veces en el Archivo {2}".format(palabra,repetidas,archivo)
else:
    print "Debes indicar el nombre del archivo"

Nhomar Hernández

unread,
Mar 19, 2014, 3:35:30 PM3/19/14
to python-v...@googlegroups.com
Ricardo.

En línux:

grep -r texto|expresion|regular path | less

Si le agregas -n te muestra el número de línea.

Tambien tienes (pero no lo domino) awk.

Exactamente que uso le darás a ésto? creo que hacer algo así en Python es muy bueno para aprender, pero no lo veo realmente útil.

En windows, creo qeu puedes instalar grep para windows.

En ubuntu usas "rgrep" te ahorras la -r

Con eso haces lo que hace éste script.

Saludos.

--
--------------------
Saludos Cordiales

Nhomar G. Hernandez M.
+58-414-4110269
Skype: nhomar00
Web-Blog: http://geronimo.com.ve
Servicios IT: http://vauxoo.com
Linux-Counter: 467724
Correos:
nho...@openerp.com.ve
nho...@vauxoo.com
twitter @nhomar

Israel

unread,
Mar 19, 2014, 3:40:35 PM3/19/14
to python-v...@googlegroups.com
Si quieres el número de veces que se repite, puedes usar wc

rgrep patron path | wc -l (el número de veces que se repite)

Si quieres el número de ocurrencias únicas, creo, que podrías hacerlo así:

rgrep patron path | sort | uniq | wc -l



--
Este es un mensaje del foro Python de Venezuela - http://www.python.org.ve
Para suscripciones y retiros: http://goo.gl/ug9by
---
Has recibido este mensaje porque estás suscrito al grupo "Python Venezuela" de Grupos de Google.
Para anular tu suscripción a este grupo y dejar de recibir sus mensajes, envía un mensaje a python-venezue...@googlegroups.com.
Para acceder a más opciones, visita https://groups.google.com/d/optout.



--
Israel Fermín Montilla

Israel

unread,
Mar 19, 2014, 3:41:07 PM3/19/14
to python-v...@googlegroups.com
A menos que estés aprendiendo, no es sano reinventar la rueda.

Milton Mazzarri

unread,
Mar 19, 2014, 3:48:58 PM3/19/14
to python-v...@googlegroups.com
2014-03-19 13:40 GMT-06:00 Israel <fermi...@gmail.com>:
> Si quieres el número de veces que se repite, puedes usar wc
>
> rgrep patron path | wc -l (el número de veces que se repite)
>

Hmmm, tal vez usaría lo siguiente:

$ grep -nr -e "expresion" | awk -F: '{print $1}' | sort | uniq -c |
sort -k1 -n -r

Con lo anterior obtendrías un resultado similar al siguiente:

990 fichero1
840 fichero2
8 fichero3

Es decir, te ordena de manera decreciente las coincidencias (990, 840,
8) encontradas acorde con la expresión dada, también en el caso de
Perl puedes apelar a File::Find/File::Grep, en Python tendrías que
hacer una suerte de os.walk más el módulo re para el manejo de
expresiones regulares.

Un saludo, feliz día,

Ricardo Garcia

unread,
Mar 19, 2014, 4:08:44 PM3/19/14
to python-v...@googlegroups.com
Precisamente es para aprender y familiarizarme con python y Linux porque soy nuevo trabajando en ellos

lo que no logro hacer es que la búsqueda sea recursiva es decir busque dentro de sub-carpetas!

Gracias por todo, Feliz tarde


--
Este es un mensaje del foro Python de Venezuela - http://www.python.org.ve
Para suscripciones y retiros: http://goo.gl/ug9by
---
Has recibido este mensaje porque estás suscrito al grupo "Python Venezuela" de Grupos de Google.
Para anular la suscripción a este grupo y dejar de recibir sus correos electrónicos, envía un correo electrónico a python-venezue...@googlegroups.com.
Para obtener más opciones, visita https://groups.google.com/d/optout.

Israel

unread,
Mar 19, 2014, 4:21:51 PM3/19/14
to python-v...@googlegroups.com
revisa la documentación de os.walk y ve qué puedes hacer con él ;-)


Para anular la suscripción a este grupo y dejar de recibir sus mensajes, envía un mensaje de correo a python-venezue...@googlegroups.com.

Para acceder a más opciones, visita https://groups.google.com/d/optout.

Nhomar Hernández

unread,
Mar 19, 2014, 4:28:40 PM3/19/14
to python-v...@googlegroups.com

El 19 de marzo de 2014, 14:21, Israel <fermi...@gmail.com> escribió:
revisa la documentación de os.walk y ve qué puedes hacer con él ;-)

Alguna vez lo hice para algo bien específico cuando también estaba aprendiendo.


El método def explorar hace la magia para que aprendas el uso del walk.

FYI, ese algoritmo lo saqué de una respuesta de alguien en stackoverflow "tu mejor amigo después de la lista python-venezuela" ;-)

Milton Mazzarri

unread,
Mar 19, 2014, 4:41:05 PM3/19/14
to python-v...@googlegroups.com
2014-03-19 14:08 GMT-06:00 Ricardo Garcia <ricardojo...@gmail.com>:
> Precisamente es para aprender y familiarizarme con python y Linux porque soy
> nuevo trabajando en ellos

Perfecto, entonces con la parte de Linux ya lo tienes cubierto, al
menos puedes comenzar leyendo las páginas "man" de grep, awk, sort,
uniq. Lee con detenimiento y entiende los parámetros.

> lo que no logro hacer es que la búsqueda sea recursiva es decir busque
> dentro de sub-carpetas!

Ok, vamos por partes:

1) En principio no te recomendaría capturar los parámetros indicados a
través de la línea de comandos por medio de sys.argv, hay módulos en
Python más especializados y que terminan por mejorar tu programa y la
interacción que puede tener el usuario con tu script, lee por favor
sobre argparse[1].

2) Una vez hayas capturado el parámetro del path debes verificar que
sea un directorio y exista, para ello tienes el módulo os.path, en
particular revisa el método isdir[2].

3) Si el path es correcto a través de os.walk[3] comienza a recorrer
el árbol, walk te dará la información necesaria sobre los ficheros y
directorios hijos que necesitarás abrir y recorrer línea a línea para
encontrar tu expresión regular (ver módulo re[4]), puedes llevar un
conteo de coincidencias por archivo.

4) Prepara la salida del programa, puede ser que dependiendo de los
parámetros suministrados por el usuario la alteres. Por ejemplo, el
parámetro -r activa la muestra de resultados en forma inversa.

5) Después de terminar el script y tomes algo de confianza con el
lenguaje puedes revisar OpenHatch[5]

Espero te sirva la información,

Bienvenido a Python Venezuela.

[1] http://docs.python.org/2/howto/argparse.html
[2] http://docs.python.org/2/library/os.path.html#os.path.isdir
[3] http://docs.python.org/2/library/os.html#os.walk
[4] http://docs.python.org/2/library/re.html
[5] https://openhatch.org/
--
Milton Mazzarri, a.k.a. [milmazz]
Usuario de GNU/Linux: #369158
http://milmazz.com.ve

Ricardo Garcia

unread,
Mar 20, 2014, 5:13:31 PM3/20/14
to python-v...@googlegroups.com

Ricardo Garcia

unread,
Mar 20, 2014, 5:32:25 PM3/20/14
to python-v...@googlegroups.com



Buenas tardes lista,
 
    Los consulto para saber como le digo a python que un valor tomado de un sys.argv es directorio o archivo he conseguido hacerlo por separado porque cuando quiero condicionar la lista de argumento no encuentro como expresarlo he leido sobre getopt pero busco que sea automatizado que el sepa diferenciar lo que es parametro también lei sobre argparse y subprocess pero no consigo condicionar dicho parametro.
   Cualquier consejo, ejemplo de código o referencia a las librerías que debo usar son bienvenidos.
 

Wil Alvarez

unread,
Mar 21, 2014, 9:49:02 AM3/21/14
to python-v...@googlegroups.com
Ricardo,

El módulo os.path [1] te da herramientas para eso, puedes preguntar cosas como:

os.path.isfile(path)

O sino:

os.path.isdir(path)

Y te devolverá True o False según sea el caso.

Saludos



--
Este es un mensaje del foro Python de Venezuela - http://www.python.org.ve
Para suscripciones y retiros: http://goo.gl/ug9by
---
Has recibido este mensaje porque estás suscrito al grupo "Python Venezuela" de Grupos de Google.
Para anular la suscripción a este grupo y dejar de recibir sus mensajes, envía un mensaje de correo a python-venezue...@googlegroups.com.
Para acceder a más opciones, visita https://groups.google.com/d/optout.



--
Wil A. Alvarez
Linux Counter #415026
Debian Counter #259
Reply all
Reply to author
Forward
0 new messages