Hola Carlos,

yo definiría los filtros como funciones y los aplicaría uno por uno a los
datos en el bucle de lectura.

Si necesitas comparar filas arbitrarias, lo más sencillo es guardar los
datos leídos en memoria —pero ten en cuenta que esto puede ser un problema
si tu conjunto de datos es demasiado grande. Para los casos que citas, sólo
sería necesario guardarse la fila nueva y la anterior.

def cero_y_cien(nuevos, datos):
    return not (nuevos[3] == '0' and nuevos[4] == '100')

def valor_mayor(nuevos, datos):
    # compara nuevos con la fila mas reciente de datos
    return int(nuevos[4]) >= int(datos[-1][4])

datos = []
filtros = (cero_y_cien, valor_mayor)
for linea in leer.readlines():
    nuevos = linea.strip().split(';')
    datos.append(nuevos)

    for fn in filtros:
        valido = fn(nuevos, datos)

Si quieres comparar los datos independientemente —por columnas— lo más
conveniente es convertir cada fila en una lista. ¿Qué quieres decir con que
te duplica el peso de los archivos?

Un método un poco más sofisticado podría ser lanzar excepciones cuando un
filtro falla, y recogerlas en el bucle con un try/except:

def cero_y_cien(nuevos, datos):
    if (nuevos[3] == 0 and nuevos[4] == 100):
        raise ValueError('las columnas 3 y 4 son 0 y 100 respectivamente')

Personalmente no usaría numpy para este tratamiento de datos.

No he probado el código pero espero que te sirva de orientación.

Saludos,
Jacobo.

El 17 de enero de 2013 11:10, Carlos Agulló Calvo <cm.agu...@gmail.com>escribió:

> Muchas gracias por la respuesta (y por la velocidad en ella)
>
> Aprovecha el for para aplicar tus filtros directamente ahí a medida que
> vas leyendo. Mete un par de ifs para tratar si es el principio o fin del
> fichero para comparar con el dato anterior (en fecha).
>
> Sí, pensaba aprovechar el for para poner los filtros. Lo de los ifs es
> buena idea para saber si es primera o última fila, pero lo que no se es
> comparar entre 2 filas cualquiera (p.ej la fila 11 y la 12).
> Por cierto, ¿es necesario pasar a listas las filas? es que se me duplica
> el peso de los archivos que ya de por si son bastante pesados.
>
>
> ¿Te has planteado usar numpy para esto o no es posible y debes usar python
> puro? Numpy te podría facilitar mucho las cosas y librarte de algún for que
> te ralentice el programa.
>
> No he usado nunca numpy, es más, ni siquiera sabía de su existencia. Soy
> bastante novato y el tratamiento de los datos es para un tema de la
> universidad, por lo que puedo usar lo que quiera, sólo que pensé que python
> era lo mejor y por eso me puse a aprenderlo por libre. Me voy a bajar numpy
> y matplotlib porque luego tendré que ponerme a hacer gráficos con los
> resultados.
>
> Un saludo
>
> El 17 de enero de 2013 10:56, Kiko <kikocorre...@gmail.com> escribió:
>
>>
>>
>> El 17 de enero de 2013 10:46, Carlos Agulló Calvo 
>> <cm.agu...@gmail.com>escribió:
>>
>> hola
>>>
>>> Hace ya tiempo pregunté varias dudas sobre el tratamiento de datos que
>>> están en un .txt desde entonces, he conseguido varios progresos, pero ahora
>>> me he quedado estancado en un punto del que no se salir.
>>>
>>> Mi duda consiste en lo siguiente:
>>>
>>> tengo los datos de la siguiente manera:
>>>
>>> "0303201";1/4/2009
>>> 0:01:00;2;0;0;0;0;117;44;163;2;0;0;0;-127;2;-127;-127;-127;-127;0
>>> "0303201";1/4/2009
>>> 0:02:00;2;1;0;0;0;104;92;255;1;0;1;1;-127;1;-127;-127;-127;-127;0
>>> (Es un extracto)
>>>
>>> y querría poder compararlos entre las filas para aplicar una serie de
>>> filtros y en función de si cumplen o no los filtros que vayan a archivos
>>> separados.
>>>
>>> He pensado que debería hacer que cada fila fuera una lista y por eso he
>>> hecho este programa:
>>>
>>> leer=open("datos.txt","r")
>>> lista=open("datos_lista.txt","a")
>>> validos=open("est_0303201_VAL.txt","a")
>>> no_validos=open("est_0303201_ERR.txt","a")
>>>
>>> for i in leer.readlines():          #con esto lee cada línea
>>>     datos=i.strip().split(";")      #guarda cada linea como una lista
>>>     lista.write(str(datos)+"\n")  #escribe en VALIDOS (datos_lista.txt)
>>> las lineas como listas [,]
>>>
>>>
>>>
>>> leer.close()
>>> validos.close()
>>>
>>> que me crea 2 archivos vacíos y uno con los datos en forma de listas así:
>>>
>>> ['"0303201"', '1/4/2005 0:01:00', *'2', '0'*, '0', '0', '0', '143',
>>> '-127', '-127', '2', '0', '0', '0', '-127', '2', '-127', '-127', '-127',
>>> '-127', '0']
>>> ['"0303201"', '1/4/2005 0:02:00', *'0', '100'*, '0', '0', '0', '106',
>>> '-127', '-127', '1', '0', '1', '1', '-127', '1', '-127', '-127', '-127',
>>> '-127', '0']
>>> (es un extracto)
>>>
>>> El problema es que no sé cómo poner los filtros.
>>>
>>> Por ejemplo, quiero que si  la columna en negrita 1 es cero y la columna
>>> en negrita 2 es 100 se considere error.
>>>
>>> o que en el siguiente ejemplo:
>>>
>>> ['"0303201"', '1/4/2005 0:01:00', '2', '0', '0', '0', '0', *'143'*,
>>> '-127', '-127', '2', '0', '0', '0', '-127', '2', '-127', '-127', '-127',
>>> '-127', '0']
>>> ['"0303201"', '1/4/2005 0:02:00', '0', '100', '0', '0', '0', *'106'*,
>>> '-127', '-127', '1', '0', '1', '1', '-127', '1', '-127', '-127', '-127',
>>> '-127', '0']
>>> (es un extracto)
>>>
>>> si en la fila 2 la columna en negrita es menor que en la fila 1 también
>>> de error.
>>>
>>> (luego pondría yo que me diga el filtro que no cumple, pero eso creo que
>>> lo sé hacer).
>>>
>>> ¿Podríais ayudarme?
>>>
>>> Muchas gracias
>>>
>>>
>>>
>> Aprovecha el for para aplicar tus filtros directamente ahí a medida que
>> vas leyendo. Mete un par de ifs para tratar si es el principio o fin del
>> fichero para comparar con el dato anterior (en fecha).
>>
>> ¿Te has planteado usar numpy para esto o no es posible y debes usar
>> python puro? Numpy te podría facilitar mucho las cosas y librarte de algún
>> for que te ralentice el programa.
>>
>> _______________________________________________
>> Python-es mailing list
>> Python-es@python.org
>> http://mail.python.org/mailman/listinfo/python-es
>> FAQ: http://python-es-faq.wikidot.com/
>>
>>
>
> _______________________________________________
> Python-es mailing list
> Python-es@python.org
> http://mail.python.org/mailman/listinfo/python-es
> FAQ: http://python-es-faq.wikidot.com/
>
>
_______________________________________________
Python-es mailing list
Python-es@python.org
http://mail.python.org/mailman/listinfo/python-es
FAQ: http://python-es-faq.wikidot.com/

Responder a