[Python-es] Buscar palabras en un archivo

ruben linux rubia.linux en gmail.com
Lun Jun 16 08:29:02 CEST 2014


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()

	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/
>>
>>
>


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