[Python-es] Busqueda cadenas NO coincidentes

5 views
Skip to first unread message

Manuel Enrique González Ramírez

unread,
Mar 23, 2010, 9:45:48 AM3/23/10
to pyth...@python.org
Hola amig@s de la lista.

Tengo este pequeño inconveniente.

Tengo dos archivos (archivo1.txt y archivo2.xml).  Archivo1 contiene una lista de datos en la siguiente forma:

primerdato
segundodato
tercerdato
.
.
.
etc


Archivo2.txt es un archivo en formato XML que tiene la estructura propia de un archivo de este tipo, completamente diferente al archivo1.txt

Lo que necesito que haga mi programa es:
1. Leer linea a linea archivo1.txt
2. Cada vez que se lea una línea de archivo1.txt busque si esa palabra se encuentra en archivo2.xml
3. Si la palabra NO se encuentra en archivo2.xml se debe crear un archivo nuevo (diferencias.txt) que agregue esa palabra que no encontro en archivo2.xml.  Si el archivo diferencias.tx ya existe entonces que agregue una linea nueva al archivo diferencias.txt con la palabra en cuestion.

Lo que tengo:
Tengo un prototipo que inicialmente me funciono con dos archivos de texto pequeño (en pruebas) y misma estructura, pero al ponerlo en producción este no me funciona de la forma deseada ya que me copia todos los registros que contiene el archivo1.txt.

Este es el codigo para aquel/aquella que me pueda colaborar,  y de una vez MuuuuChassss Gracias

#-*- coding: cp1252 -*-
"""Abro el primer archivo para
leer la cantidad de líneas
que posee """
f1 = open("archivo1.txt","r")
a = 0
for i in f1.readlines():
    a += 1
cantidad = a
f1.close()


contador = 0
while contador <= cantidad:
    #Abro el primer archivo para la lectura
    f1 = open("archivo1.txt","r")
    for linea in f1:
    #Evito que se muestren los saltos de línea
    if linea[-1]=='\n':
            linea = linea[:-1]
    buscar = linea #Asigno cada línea a la variable buscar

    #Abro el segundo archivo donde se buscará la variable
    f2 = open("archivo2.xml","r")
        archivo2 = f2.read() #Leo Completamente el archivo
    #Lee la variable y la busca
    if archivo2.find(buscar)>=0:
        print buscar+' OK '
    else:
        f3 = open("diferencias.txt","a")
            f3.write(buscar+"\n") #Si no encuentra la variable pone Fail
        f3.close()#Cierro el archivo que se crea

    contador += 1

f2.close() #Cierro el archivo donde se busca
f1.close() #Cierro el archivo que contiene las variables a buscar

print "Fin de la busqueda"

--
Manuel Enrique González Ramírez
http://maengora.blogspot.com

Jose Caballero

unread,
Mar 23, 2010, 10:09:31 AM3/23/10
to La lista de python en castellano
No se lee bien, la indentación se ha estropeado. Prueba a usar alguna URL para compartir código.


Arnau Sanchez

unread,
Mar 23, 2010, 10:37:03 AM3/23/10
to La lista de python en castellano
On 23/03/10 14:45, Manuel Enrique González Ramírez wrote:

> Lo que necesito que haga mi programa es:
> 1. Leer linea a linea archivo1.txt
> 2. Cada vez que se lea una línea de archivo1.txt busque si esa palabra
> se encuentra en archivo2.xml
> 3. Si la palabra NO se encuentra en archivo2.xml se debe crear un
> archivo nuevo (diferencias.txt) que agregue esa palabra que no encontro
> en archivo2.xml. Si el archivo diferencias.tx ya existe entonces que
> agregue una linea nueva al archivo diferencias.txt con la palabra en
> cuestion.

Python sería un lenguaje "de scripting" muy, muy triste, si para conseguir esto
necesitáramos tal cantidad de código. Sin cubrir quizá todos los detalles,
podrías partir de algo así:

output = (line for line in open("archivo1.txt")
if line.strip() not in open("archivo2.xml").read())
open("diferencias.txt", "a+").writelines(output)

Por cierto, añadir datos a archivos (operación no idempotente) suele ser una
mala idea, yo usaría el modo "w" y si hay diferentes fuentes las uniría después.

Conceptualmente no sé si tiene mucho sentido mirar si una palabra está o no en
un formato estructurado como XML, pero bueno, supongo que eso ya lo tienes
controlado.
_______________________________________________
Python-es mailing list
Pyth...@python.org
http://mail.python.org/mailman/listinfo/python-es
FAQ: http://python-es-faq.wikidot.com/

lasizoillo

unread,
Mar 23, 2010, 10:33:47 AM3/23/10
to La lista de python en castellano
El día 23 de marzo de 2010 14:45, Manuel Enrique González Ramírez
<maen...@gmail.com> escribió:

> Hola amig@s de la lista.
>
> Tengo este pequeño inconveniente.
>
> Tengo dos archivos (archivo1.txt y archivo2.xml).  Archivo1 contiene una
> lista de datos en la siguiente forma:
>
> primerdato
> segundodato
> tercerdato
> .
> .
> .
> etc
>
>
> Archivo2.txt es un archivo en formato XML que tiene la estructura propia de
> un archivo de este tipo, completamente diferente al archivo1.txt
>
> Lo que necesito que haga mi programa es:
> 1. Leer linea a linea archivo1.txt
> 2. Cada vez que se lea una línea de archivo1.txt busque si esa palabra se
> encuentra en archivo2.xml
> 3. Si la palabra NO se encuentra en archivo2.xml se debe crear un archivo
> nuevo (diferencias.txt) que agregue esa palabra que no encontro en
> archivo2.xml.  Si el archivo diferencias.tx ya existe entonces que agregue
> una linea nueva al archivo diferencias.txt con la palabra en cuestion.
>

¿Es abordable meter todas las palabras de archivo2.xml en un set? Si
es así hazlo y verás que rapidito vas. Si no es abordable meterlo en
memoria, puedes probar a usar una berkeleydb.

http://docs.python.org/library/sets.html#module-sets
http://docs.python.org/library/bsddb.html#module-bsddb

Los dos modulos han sido marcados como "deprecated". El primero viene
incluido como tipo del sistema y para el segundo puedes usar las
librerias de jcea (otro listero).

http://www.jcea.es/programacion/pybsddb.htm

Así que no preocuparse por quedarse sin soporte ;-)

Un saludo:

Javi

Olemis Lang (Simelix)

unread,
Mar 23, 2010, 10:53:54 AM3/23/10
to La lista de python en castellano
2010/3/23 Arnau Sanchez <pya...@gmail.com>:

> On 23/03/10 14:45, Manuel Enrique González Ramírez wrote:
>
>> Lo que necesito que haga mi programa es:
>> 1. Leer linea a linea archivo1.txt
>> 2. Cada vez que se lea una línea de archivo1.txt busque si esa palabra
>> se encuentra en archivo2.xml
>> 3. Si la palabra NO se encuentra en archivo2.xml se debe crear un
>> archivo nuevo (diferencias.txt) que agregue esa palabra que no encontro
>> en archivo2.xml.  Si el archivo diferencias.tx ya existe entonces que
>> agregue una linea nueva al archivo diferencias.txt con la palabra en
>> cuestion.
>
[...]

>
> Conceptualmente no sé si tiene mucho sentido mirar si una palabra está o no
> en un formato estructurado como XML, pero bueno, supongo que eso ya lo
> tienes controlado.

A priori, mi sugerencia es una de las siguiente (sobre todo si hubiera
algún órden ... ;o) :

- Generar XML a partir del fichero texto y hacer un diff
con lxml (al nivel de las etiquetas ;o)
- Generar texto a partir del fichero XML y hacer un diff
normal (e.g. udiff ) con difflib

--
Regards,

Olemis.

Blog ES: http://simelo-es.blogspot.com/
Blog EN: http://simelo-en.blogspot.com/

Featured article:

Boris Perez Canedo

unread,
Mar 24, 2010, 4:30:02 PM3/24/10
to La lista de python en castellano
while contador     #Abro el primer archivo para la lectura

    f1 = open("archivo1.txt","r")
    for linea in f1:
    #Evito que se muestren los saltos de línea
    if linea[-1]=='\n':
            linea = linea[:-1]
    buscar = linea #Asigno cada línea a la variable buscar

    #Abro el segundo archivo donde se buscará la variable
    f2 = open("archivo2.xml","r")
        archivo2 = f2.read() #Leo Completamente el archivo
    #Lee la variable y la busca
    if archivo2.find(buscar)>=0:
        print buscar+' OK '
    else:
        f3 = open("diferencias.txt","a")
            f3.write(buscar+"\n") #Si no encuentra la variable pone Fail
        f3.close()#Cierro el archivo que se crea

    contador += 1

f2.close() #Cierro el archivo donde se busca
f1.close() #Cierro el archivo que contiene las variables a buscar

print "Fin de la busqueda"


Hola,

Esto te puede dar las lineas sin \n

f = open("archivo1.txt","r")
lines = []
for line in f.readlines():
    if line <> '\n':
        lines.append(line.replace('\n',''))
f.close()
print lines       


Como es logico no se lo que guardas en tu archivo1.txt ni tampoco en tu archivo2.xml. Pero debes cuidarte de que los tags de tu archivo xml no vayan a coincidir con los datos en tu archivo archivo1.txt, (si es que te interesa que no coincidan) por eso te sugiero que uses xml.etree.ElementTree para trabajar con el archivo xml.

Saludos.
Boris.


La mejor vacuna contra el virus A(H1N1) es la higiene personal

Arnau Sanchez

unread,
Mar 25, 2010, 4:56:41 AM3/25/10
to La lista de python en castellano
On 24/03/10 21:30, Boris Perez Canedo wrote:

> Esto te puede dar las lineas sin \n
>
> f = open("archivo1.txt","r")
> lines = []
> for line in f.readlines():
> if line <> '\n':
> lines.append(line.replace('\n',''))
> f.close()
> print lines

Mejor:

lines = [line.rstrip() for line in open("archivo1.txt") if line.strip()]

Reply all
Reply to author
Forward
0 new messages