[Python-es] Tratar datos txt entre filas

Carlos Agulló Calvo cm.agullo en gmail.com
Jue Ene 17 17:51:20 CET 2013


Muchas gracias a todos.

Como no sé utilizar ninguno de los módulos que habéis dicho los trastearé
un poco a ver cual se adapta mejor a lo que necesito (o yo a él).

¿Si utilizara el modulo de CSV o lo hiciera sin módulo podría utilizar
después el Matplotlib?

Con respecto al código de Jacobo, aún no me he podido poner con ello, pero
en cuanto pueda lo miraré con detalle.

Un saludo a todos.

 El 17 de enero de 2013 12:20, Jose Luis Dallapiccola
<jldalla en gmail.com>escribió:

> 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.tarragon en 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.agullo en 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 <kikocorreoso en gmail.com> escribió:
>>>
>>>>
>>>>
>>>> El 17 de enero de 2013 10:46, Carlos Agulló Calvo <cm.agullo en 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 en python.org
>>>> http://mail.python.org/mailman/listinfo/python-es
>>>> FAQ: http://python-es-faq.wikidot.com/
>>>>
>>>>
>>>
>>> _______________________________________________
>>> Python-es mailing list
>>> Python-es en python.org
>>> http://mail.python.org/mailman/listinfo/python-es
>>> FAQ: http://python-es-faq.wikidot.com/
>>>
>>>
>>
>> _______________________________________________
>> Python-es mailing list
>> Python-es en 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 en python.org
> http://mail.python.org/mailman/listinfo/python-es
> FAQ: http://python-es-faq.wikidot.com/
>
>
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://mail.python.org/pipermail/python-es/attachments/20130117/70fa9f77/attachment.html>


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