[Python-es] Buscar palabras en un archivo

3,673 views
Skip to first unread message

ruben linux

unread,
Jun 8, 2014, 2:46:49 PM6/8/14
to pyth...@python.org
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

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.

Tal vez usando listas... En tal caso cual es el tamaño máximo de una lista???.

Gracias a todos.

David

unread,
Jun 8, 2014, 2:52:10 PM6/8/14
to pyth...@python.org
Primero tiens que abrir el archivo:

f=open(a,'r')

luego leer el fichero:

lines = f.readlines()

Y ya puedes hacer el bucle:

for line in lines:
    if palabra in line:
        print line

David

El 08/06/14 11:05, ruben linux escribió:
_______________________________________________ Python-es mailing list Pyth...@python.org https://mail.python.org/mailman/listinfo/python-es FAQ: http://python-es-faq.wikidot.com/

monoBOT

unread,
Jun 8, 2014, 3:30:38 PM6/8/14
to La lista de python en castellano
Yo usaría with ... para no tener que cerrar el archivo, aunque en este caso no importa tanto porque estás en solo lectura.

with open('fichero', 'r') as fichero:
    bla bla bla
--
monoBOT
Visite mi sitio(Visit my site): monobotblog.alvarezalonso.es

Chema Cortes

unread,
Jun 8, 2014, 3:49:01 PM6/8/14
to La lista de python en castellano
El 8 de junio de 2014, 12:05, ruben linux <rubia...@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
Pyth...@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

Flavio Danesse

unread,
Jun 9, 2014, 4:08:37 PM6/9/14
to p...@ch3m4.org, La lista de python en castellano
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.

ruben linux

unread,
Jun 16, 2014, 2:29:13 AM6/16/14
to La lista de python en castellano
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 <fdan...@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*

Hiko hitokiri

unread,
Jun 16, 2014, 4:01:32 AM6/16/14
to La lista de python en castellano
si estan asi digo que lo mejor es hacer un csv para tomar mas fácil los parámetros a buscar

Chema Cortes

unread,
Jun 16, 2014, 5:16:50 AM6/16/14
to La lista de python en castellano
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.

Flavio Danesse

unread,
Jun 16, 2014, 4:46:13 PM6/16/14
to p...@ch3m4.org, La lista de python en castellano
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.

ruben linux

unread,
Jun 25, 2014, 11:51:45 PM6/25/14
to La lista de python en castellano
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 <fdan...@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

Jose Caballero

unread,
Jun 26, 2014, 10:31:17 AM6/26/14
to La lista de python en castellano
Hola,

creo que te estas complicando demasiado la vida. Los arboles ya no te
dejan ver el bosque.
Sin embargo, al menos estas intentando cosas. Pones esfuerzo de tu
parte. Ya es algo.

El primer problema por el que es dificil ayudarte es que no nos has
dicho (o no lo recuerdo) como son los ficheros.
Nos dices que buscas en uno las palabras que hay en el otro. Pero ese
otro, como es? Una lista de palabras, en una fila? En una columna? o
no tiene "formato"?

He decidido asumir que es el caso 2, las palabras estan en una
columna. Si no es correcto, al menos el codigo que te muestro te puede
dar una pista.


$ cat list
palabra1
palabra2
palabra3

$ cat text
lasfas palabra1 ;asflasf f
lafa palabra2 lafasfd palabra3 afasdf
alsdfasdfaf
lasfdasfd asfdadsf afa fdaf
palabra3 afasfdas palabra2
afads asdfas asfas fafas

$ cat kk.py
# quick and dirty solution

list_words = []
list_lines = []

f1 = open('list')
for line in f1.readlines():
# remove the trailing \n
list_words.append(line[:-1])

f2 = open('text')
for line in f2.readlines():
# remove the trailing \n
list_lines.append(line[:-1])

for line in list_lines:
for word in list_words:
if word in line:
print line
# one word per line is enough
break

Manuel Enrique González Ramírez

unread,
Jun 26, 2014, 12:10:34 PM6/26/14
to La lista de python en castellano
Compañero,

A ver si te sirve este pequeño código que hice creo que hace dos años cuando surgió la necesidad en la empresa de generar unos reportes en base a los logs que dejaba un servidor:

import os

# Solicito el nombre del archivo a analizar
narchivo = raw_input('Archivo log a analizar: ')

try:
    # Abro el archivo para la lectura
    archivo = open(narchivo,'r')

    # Inicio el contador
    cENV = 0
    cREC = 0
    cE50 = 0
    cE20 = 0

    # Inicio el bucle que lee el archivo
    # y agrego la condicion que busca la palabra
    for linea in archivo:
    if linea.find('ENV') >= 0:
        cENV += 1
    if linea.find('REC') >= 0:
        cREC += 1
    if linea.find('50 null') >= 0:
        cE50 += 1
    if linea.find('20 Operador') >= 0:
        cE20 += 1

    # Cierro el Archivo
    archivo.close()
    print 'Total solicitudes enviadas: ',cENV + 1
    print 'Total solicitudes recibidas: ',cREC + 1
    print 'Total respuesto 50 null: ',cE50 + 1
    print 'Total respuesta 20 Operador no responde: ',cE20 + 1

except IOError:
    print 'El archivo indicado no existe'
_______________________________________________
Python-es mailing list
Pyth...@python.org
https://mail.python.org/mailman/listinfo/python-es
FAQ: http://python-es-faq.wikidot.com/




--
Manuel Enrique González Ramírez
http://maengora.blogspot.com
Reply all
Reply to author
Forward
0 new messages