[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