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 <[email protected]> escribió: > El 16 de junio de 2014, 8:29, ruben linux <[email protected]> > 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 <[email protected]> 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 <[email protected]> >> escribió: >> > >> >> El 8 de junio de 2014, 12:05, ruben linux <[email protected]> >> >> 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 >> >>> [email protected] >> >>> 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 >> >> [email protected] >> >> https://mail.python.org/mailman/listinfo/python-es >> >> FAQ: http://python-es-faq.wikidot.com/ >> >> >> >> >> > >> _______________________________________________ >> Python-es mailing list >> [email protected] >> 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 > [email protected] > https://mail.python.org/mailman/listinfo/python-es > FAQ: http://python-es-faq.wikidot.com/ > >
_______________________________________________ Python-es mailing list [email protected] https://mail.python.org/mailman/listinfo/python-es FAQ: http://python-es-faq.wikidot.com/
