[Python-es] Buscar palabras en un archivo

Chema Cortes pych3m4 en gmail.com
Lun Jun 16 11:16:39 CEST 2014


El 16 de junio de 2014, 8:29, ruben linux <rubia.linux en gmail.com> escribió:

> El proposito de este programa es buscar palabras dentro de un archivo,
> pasandole como argumento otro archivo que contiene una lista de
> palabras.
>
> Funciona a medias, me explico!!! solo lee la primera palabra de cada linea.
>
> Por ejemplo, supongamos esta linea: "uno, dos, tres, cuatro,..." y en
> el archivo de palabras, las tengo todas pero, solo me encuentra la
> primera.
>
> Por que?????
>
> Eso es lo que necesito saber.
>
> Os dejo el codigo, y asi lo entendereis mejor.
>
> #!/usr/bin/env python
>
> import os,argparse
>
> # Argumentos
> parser = argparse.ArgumentParser(description='busca las cadenas de
> archivo1 en archivo2')
> parser.add_argument('-a','--archivo1', help='archvio contine cadenas',
> required=True)
> parser.add_argument('-A','--archivo2', help='archivo en el que
> buscamos', required=True)
> args = parser.parse_args()
>
> file1 = args.archivo1
> file2 = args.archivo2
>
> try:
>         # Abro el archivo 1
>         archivo1 = open(file1,'r')
>         # Leo todo el archivo1
>         lee1 = archivo1.readlines()
>

Ten en cuenta que "readlines" lee líneas completas, añadiendo un '\n' al
final que tendrías que quitar. Lo extraño es que encuentres alguna palabra.



>
>         for i in lee1:
>                 # Abro archivo 2
>                 archivo2 = open(file2,'r')
>                 # Leo completamente el archivo2
>                 lee2 = archivo2.read()
>                 # -1 no esta, distinto de -1, si esta
>                 if lee2.find(i) != -1:
>                         # Muestra coincidencias
>                         print i
>
>                 archivo2.close()
>
>         archivo1.close()
>
> except IOError:
>  print 'El archivo indicado no existe'
>
>
> El 9/6/14, Flavio Danesse <fdanesse en gmail.com> escribió:
> > Si abres el archivo y lo lees, pasandole su contenido a una variable, esa
> > variable será de tipo string.
> > Y los objetos string tienen una función llamada *find*
> >
> > *find(s, *args)*
> >
> > *rfind(s, sub [,start [,end]]) -> in*
> >
> >
> >
> > Return the lowest index in s where substring sub is found,
> > such that sub is contained within s[start,end].  Optional
> > arguments start and end are interpreted as in slice notation.
> >
> > Return -1 on failure.
> >
> >
> >
> > El 8 de junio de 2014, 16:48, Chema Cortes <pych3m4 en gmail.com> escribió:
> >
> >> El 8 de junio de 2014, 12:05, ruben linux <rubia.linux en gmail.com>
> >> escribió:
> >>
> >> Saludos a todos, este es mi primer correo a la lista.
> >>>
> >>> Estoy empezando con Python, y este me pareció un buen sitio para
> empezar
> >>> y aprender. Decirnos antes de nada que este tema ya se lo busque en
> >>> Google,
> >>> y no doy con la respuesta adecuada, o la que me soluciona el problema.
> >>>
> >>> Como parte de mi aprendizaje, me he propuesto hacer un suripanta que
> >>> busque palabras en un archivo, esta palabras están en otro archivo. Os
> >>> dejo
> >>> un trozo del código
> >>> ...
> >>> for line in file (a, 'r')
> >>>       if palabra in líne:
> >>>              print line
> >>>
> >>> palabra es una función que lee el archivo fuente, donde se encuentran
> >>> las
> >>> palabras que quiero buscar. Esté el el fallo que me devuelve:
> >>>
> >>>    TypeError: 'in <string>' requires string as left operand! nota file
> >>>
> >>
> >> Según este error, 'palabra' es un 'file' (fichero), no una función.pyth
> >>
> >>
> >>>
> >>> Entiendo que no le puedo pasar a if un archivo, ni una función, sólo
> >>> palabras, y eso es lo que no se hacer. Necesito qué me guíen.
> >>>
> >>
> >> A un if hay que pasarle una expresión que se evalúe a true o false. El
> >> problema es que tienes que comparar contenidos comparables, una cadena
> >> dentro de otra cadena, o un elemento dentro de una lista.
> >>
> >>
> >>>
> >>> Tal vez usando listas... En tal caso cual es el tamaño máximo de una
> >>> lista???.
> >>>
> >>
> >>
> >> Puedes usar listas y su tamaño es ilimitado. Pero no te aconsejo que
> >> intentes llenar la memoria con una lista. Para estas cosas es mejor usar
> >> "iteradores" y sólo cargar en memoria los datos de un conjunto de datos
> >> con
> >> los que vayas a operar.
> >>
> >> Por ejemplo, los objetos ficheros se definen como iteradores. Para saber
> >> si una palabra está en un fichero:
> >>
> >> with open("fichero.txt") as f:
> >>    for line in f:
> >>       if palabra in line:
> >>           print "Encontrada"
> >>
> >> El fichero puede contener Gigas o Teras de información, pero sólo se
> >> necesita la memoria suficiente para cargar una línea de texto.
> >>
> >> Con algo más de experiencia, se puede hacer cosas más sofisticadas con
> >> los
> >> iteradores:
> >>
> >> def allseen(words):
> >>    state = set(words)
> >>    def _aux(lst):
> >>        state -= set(lst)
> >>        return not bool(state)    # have seen all the words?
> >>    return _aux
> >>
> >> allfounds = allseen(words)  # 'allfounds' is a function
> >> encontrada = any( allfounds(word for word in words if word in line) for
> >> line in open("fichero.txt"))
> >>
> >> La expresión es verdadera si todas las palabras de la lista "words"
> >> existen en el fichero.
> >>
> >> Además, no es necesario procesar el resto del fichero si se encuentran
> >> todas las palabras. En el momento que "allfounds" devuelve el primer
> >> true,
> >> la función "any" retorna true y se para todo el proceso.
> >>
> >>
> >>
> >> PD: no te agobies si no entiendes nada ahora mismo. Que se pueda hacer
> no
> >> quiere decir que todo el mundo lo haga así. Hazlo del modo que mejor
> >> comprendas y pregunta lo que te surga.
> >>
> >>
> >>
> >>
> >>
> >>>
> >>> Gracias a todos.
> >>>
> >>> _______________________________________________
> >>> Python-es mailing list
> >>> Python-es en python.org
> >>> https://mail.python.org/mailman/listinfo/python-es
> >>> FAQ: http://python-es-faq.wikidot.com/
> >>>
> >>>
> >>
> >>
> >> --
> >> Hyperreals *R  "Quarks, bits y otras criaturas infinitesimales":
> >> http://ch3m4.org/blog
> >> Buscador Python Hispano: http://ch3m4.org/python-es
> >>
> >> _______________________________________________
> >> Python-es mailing list
> >> Python-es en python.org
> >> https://mail.python.org/mailman/listinfo/python-es
> >> FAQ: http://python-es-faq.wikidot.com/
> >>
> >>
> >
> _______________________________________________
> Python-es mailing list
> Python-es en python.org
> https://mail.python.org/mailman/listinfo/python-es
> FAQ: http://python-es-faq.wikidot.com/
>



-- 
Hyperreals *R  "Quarks, bits y otras criaturas infinitesimales":
http://ch3m4.org/blog
Buscador Python Hispano: http://ch3m4.org/python-es
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://mail.python.org/pipermail/python-es/attachments/20140616/ebef91e9/attachment.html>


Más información sobre la lista de distribución Python-es