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/