[Python-es] Buscar palabras en un archivo

Chema Cortes pych3m4 en gmail.com
Dom Jun 8 21:48:49 CEST 2014


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
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://mail.python.org/pipermail/python-es/attachments/20140608/72a22b36/attachment.html>


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