Hola Carlos, muy buen día.

Otra recomendación sería útilizar el módulo csv para la lectura y escritura
de los datos, ya que veo que tienen un formato CSV.

Saludos y éxitos!


2013/1/17 Jacobo Tarragón Cros <jacobo.tarra...@gmail.com>

> 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/
>
>


-- 
---
José Luis DALLAPICCOLA
Neuquén Capital
Patagonia Argentina
_______________________________________________
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