[Python-es] Buscar palabras en un archivo
ruben linux
rubia.linux en gmail.com
Jue Jun 26 05:51:40 CEST 2014
lo he resuelto, mas o menos. Pero funciona.
#!/usr/bin/env python
# python find_md5.py -a lista_palabras.txt -A texto_buscar.txt
# linea 20. "while a < 11" cambiar 11 por las lineas de archivo1
# he pensado en usar len(archivo.readlines()) pero no me funciona :-((
import 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()
archivo1 = open(args.archivo1, 'r')
archivo2 = open(args.archivo2, 'r')
lee2 = archivo2.readlines()
try:
a = 0
while a < 11: # recorre linea a linea archivo1. 11 = num de lineas archivo1
lee1 = archivo1.readline().rstrip() # lee1=valor de cada linea
for i in lee2:
if i.startswith(str(lee1)): #linea empieza por lee1
print i.rstrip()
a = a + 1
archivo1.close()
archivo2.close()
except IOError:
El 16/6/14, Flavio Danesse <fdanesse en gmail.com> escribió:
> Ruben, está bien ese programa, sólo que está incompleto porque find
> devuelve el indice de la primera coincidencia, es decir que no sigue
> buscando en el resto del texto. Yo solo te di una pista, pero hay que
> completarlo para que te encuentre todas las coincidencias.
>
> En realidad, el problema a resolver es muy fácil, hay muchas formas de
> resolverlo utilizando listas y strings y sus funciones.
>
> *Por ejemplo:*
>
> - Cargas las palabras a buscar en una lista (solo necesitas leer una
> sola vez ese archivo).
> - Luego, si lees el archivo donde debes buscar las coincidencias, y lo
> separas en lineas, tienes una lista de string.
> - Luego si cada una de esas lineas la separas en palabras (utilizando
> string.split()), entonces tienes una lista de palabras.
> - Ahora que tienes todo en listas, solo iteras y evalúas, (recuerda que
> las listas mantienen el orden de los elementos y por lo tanto poseen un
> indice)
>
> Obviamente hay muchas otras formas más elaboradas de hacerlo.
>
>
>
> El 16 de junio de 2014, 6:16, Chema Cortes <pych3m4 en gmail.com> escribió:
>
>> 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
>>
>> _______________________________________________
>> Python-es mailing list
>> Python-es en python.org
>> https://mail.python.org/mailman/listinfo/python-es
>> FAQ: http://python-es-faq.wikidot.com/
>>
>>
>
Más información sobre la lista de distribución Python-es