[Python-es] Tratar datos txt entre filas

Daπid davidmenhur en gmail.com
Jue Ene 17 18:41:49 CET 2013


Matplotlib puede pintar listas de python puro o arrays de numpy, por lo que
no es un problema cómo decidas recoger esos datos.
On Jan 17, 2013 5:53 PM, "Carlos Agulló Calvo" <cm.agullo en gmail.com> wrote:

> 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/
>>
>>
>
> _______________________________________________
> 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/c54a7733/attachment.html>


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