Re: [Python-es] Leer ultima linea de fichero CSV?
OK, gracias a todos, el fichero es de unas 8500 lineas y 15 columnas como máximo, la verdad que se hace fácil aprender gracias a los diferente puntos de vista de un mismo problema. ___ Python-es mailing list Python-es@python.org http://mail.python.org/mailman/listinfo/python-es FAQ: http://python-es-faq.wikidot.com/
Re: [Python-es] Leer ultima linea de fichero CSV?
Cualquier alternativa te va a servir El 22/07/2013 11:21, "Juan" escribió: > OK, gracias a todos, el fichero es de unas 8500 lineas y 15 columnas como > máximo, la verdad que se hace fácil aprender gracias a los diferente puntos > de vista de un mismo problema. > > > > > ___ > 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/
Re: [Python-es] Leer ultima linea de fichero CSV?
El día 22 de julio de 2013 00:05, Xavi escribió: > Hola, > > Si el fichero es grande, procesarlo en su totalidad es un gasto innecesario > de tiempo y recursos. > >> ... puedes usar deque (en el módulo collections) ... > > > Me temo que deque sigue procesando todo el fichero, descartando todas las > lineas menos las n (maxlen) últimas. > Creo que la única manera de asegurarse que sólo se procesan los últimos > MAX_READ bytes sería .- > > #!/usr/bin/env python3 > # -*- coding: utf-8 -*- > > import io > import csv > > MAX_READ = 512 > with open('data.csv', 'rb') as f: > size = f.seek(0, 2) > f.seek(-MAX_READ if size > MAX_READ else -size, 2) > # Solo procesa MAX_READ bytes > lastLine = str(list(f)[-1], 'utf-8') > row = next(csv.reader(io.StringIO(lastLine))) > print('Temperatura, {}, Humedad: {}, Presión: {}'.format(row[0], row[1], > row[2])) > Este código puede no ser portable. El método seek relativo al final del fichero no siempre funciona en todas las plataformas. Sería mejor que el segundo seek fuera relativo al principio del fichero: f.seek(max(0, size-MAX_READ)) Por otro lado, el csv.reader puede usarse con cualquier iterador, por lo que no es necesario usar el io.StringIO. Si lo juntamos todo, incluyendo el "deck" (deque): import csv from collections import deque with open('data.csv', 'rb', buffering=0) as f: size = f.seek(0,2) f.seek(max(0, size-MAX_READ=512)) temperatura, humedad, presion = next(csv.reader( str(line, 'utf-8') for line in deque(f,1) ) ) print('Temperatura, {}, Humedad: {}, Presión: {}'.format(temperatura, humedad, presion)) Por lo general, el uso de "deque" para obtener la última línea de un fichero es portable, además de ser bastante rápido (a la velocidad de C). > Un saludo > -- > Xavi > > El 21/07/2013 16:12, Kiko escribió: >> >> >> 2013/7/21 Juan mailto:htpc.c...@gmail.com>> >> >> >> Hola, quiero leer solo la ultima linea de un fichero CSV (solo la >> linea que >> se actualizo por ultima vez) y no tengo claro cual sería la mejor >> solución, >> este es el código actual: >> >> # >> # leer fichero CSV >> # >> def leer_datos(): >> y =0 >> lectura = csv.reader(open("data.csv", >> for index,row in enumerate(lectura) >> y +=1 >> print 'Linea: ' + str(linea + 1) >> print 'Temperatura' + row[0] + ', Humedad: ' + row[1] + ', >> presion: ' + row[2] >> >> gracias >> >> >> Hola, puedes usar deque (en el módulo collections) para simular un uso >> parecido al tail de algunos sistemas operativos: >> >> http://docs.python.org/2/library/collections.html#deque-recipes >> >> Lo siguiente funciona pensando que tu fichero csv tiene 3 columnas y está >> separado por comas. La función te devuelve los valores >> de cada columna como float. >> >> from collections import deque >> def tail(file): >> kk = deque(open(file), maxlen = 1) >> temp,hum,pres = kk[0].split('\n')[0].split(',') >> return float(temp), float(hum), float(pres) >> >> t, h, p = tail('tufichero.csv') # t, h, p es para temperatura, humedad y >> presión >> > ___ > Python-es mailing list > Python-es@python.org > http://mail.python.org/mailman/listinfo/python-es > FAQ: http://python-es-faq.wikidot.com/ -- Hyperreals *R "Quarks, bits y otras criaturas infinitesimales": http://ch3m4.org/blog Buscador Python Hispano: http://ch3m4.org/python-es ___ Python-es mailing list Python-es@python.org http://mail.python.org/mailman/listinfo/python-es FAQ: http://python-es-faq.wikidot.com/
Re: [Python-es] Leer ultima linea de fichero CSV?
Hola, Si el fichero es grande, procesarlo en su totalidad es un gasto innecesario de tiempo y recursos. ... puedes usar deque (en el módulo collections) ... Me temo que deque sigue procesando todo el fichero, descartando todas las lineas menos las n (maxlen) últimas. Creo que la única manera de asegurarse que sólo se procesan los últimos MAX_READ bytes sería .- #!/usr/bin/env python3 # -*- coding: utf-8 -*- import io import csv MAX_READ = 512 with open('data.csv', 'rb') as f: size = f.seek(0, 2) f.seek(-MAX_READ if size > MAX_READ else -size, 2) # Solo procesa MAX_READ bytes lastLine = str(list(f)[-1], 'utf-8') row = next(csv.reader(io.StringIO(lastLine))) print('Temperatura, {}, Humedad: {}, Presión: {}'.format(row[0], row[1], row[2])) Un saludo -- Xavi El 21/07/2013 16:12, Kiko escribió: 2013/7/21 Juan mailto:htpc.c...@gmail.com>> Hola, quiero leer solo la ultima linea de un fichero CSV (solo la linea que se actualizo por ultima vez) y no tengo claro cual sería la mejor solución, este es el código actual: # # leer fichero CSV # def leer_datos(): y =0 lectura = csv.reader(open("data.csv", for index,row in enumerate(lectura) y +=1 print 'Linea: ' + str(linea + 1) print 'Temperatura' + row[0] + ', Humedad: ' + row[1] + ', presion: ' + row[2] gracias Hola, puedes usar deque (en el módulo collections) para simular un uso parecido al tail de algunos sistemas operativos: http://docs.python.org/2/library/collections.html#deque-recipes Lo siguiente funciona pensando que tu fichero csv tiene 3 columnas y está separado por comas. La función te devuelve los valores de cada columna como float. from collections import deque def tail(file): kk = deque(open(file), maxlen = 1) temp,hum,pres = kk[0].split('\n')[0].split(',') return float(temp), float(hum), float(pres) t, h, p = tail('tufichero.csv') # t, h, p es para temperatura, humedad y presión ___ Python-es mailing list Python-es@python.org http://mail.python.org/mailman/listinfo/python-es FAQ: http://python-es-faq.wikidot.com/
Re: [Python-es] Leer ultima linea de fichero CSV?
la mejor alternativa es sin dudas la de leer linea por linea solo guardando la ultima (para no levantar todo el archivo en memoria) import csv last_row = None with open("archivo.csv") as fp: for row in csv.reader(fp): last_row=row El día 21 de julio de 2013 20:19, Angel Claudio Alvarez escribió: > El Sun, 21 Jul 2013 13:32:25 + (UTC) > Juan escribió: > >> Hola, quiero leer solo la ultima linea de un fichero CSV (solo la linea que >> se actualizo por ultima vez) y no tengo claro cual sería la mejor solución, >> este es el código actual: >> >> # >> # leer fichero CSV >> # >> def leer_datos(): >> y =0 >> lectura = csv.reader(open("data.csv", >> for index,row in enumerate(lectura) >> y +=1 >> print 'Linea: ' + str(linea + 1) >> print 'Temperatura' + row[0] + ', Humedad: ' + row[1] + ', presion: ' >> + row[2] >> >> gracias > Es muy grande el archivo?? > Por que no lo tratas como un archivo de texto comun > lo abris y lo metes en una lista: > arch = lectura.readlines() > y lees la ultima linea: > print arch[-1] > >> >> ___ >> Python-es mailing list >> Python-es@python.org >> http://mail.python.org/mailman/listinfo/python-es >> FAQ: http://python-es-faq.wikidot.com/ > > > -- > Angel Claudio Alvarez > ___ > Python-es mailing list > Python-es@python.org > http://mail.python.org/mailman/listinfo/python-es > FAQ: http://python-es-faq.wikidot.com/ -- Juan B Cabral ___ Python-es mailing list Python-es@python.org http://mail.python.org/mailman/listinfo/python-es FAQ: http://python-es-faq.wikidot.com/
Re: [Python-es] Leer ultima linea de fichero CSV?
El Sun, 21 Jul 2013 13:32:25 + (UTC) Juan escribió: > Hola, quiero leer solo la ultima linea de un fichero CSV (solo la linea que > se actualizo por ultima vez) y no tengo claro cual sería la mejor solución, > este es el código actual: > > # > # leer fichero CSV > # > def leer_datos(): > y =0 > lectura = csv.reader(open("data.csv", > for index,row in enumerate(lectura) > y +=1 > print 'Linea: ' + str(linea + 1) > print 'Temperatura' + row[0] + ', Humedad: ' + row[1] + ', presion: ' + > row[2] > > gracias Es muy grande el archivo?? Por que no lo tratas como un archivo de texto comun lo abris y lo metes en una lista: arch = lectura.readlines() y lees la ultima linea: print arch[-1] > > ___ > Python-es mailing list > Python-es@python.org > http://mail.python.org/mailman/listinfo/python-es > FAQ: http://python-es-faq.wikidot.com/ -- Angel Claudio Alvarez ___ Python-es mailing list Python-es@python.org http://mail.python.org/mailman/listinfo/python-es FAQ: http://python-es-faq.wikidot.com/
Re: [Python-es] Leer ultima linea de fichero CSV?
On Sun, Jul 21, 2013 at 3:32 PM, Juan wrote: > Hola, quiero leer solo la ultima linea de un fichero CSV (solo la linea que > se actualizo por ultima vez) y no tengo claro cual sería la mejor solución, > este es el código actual: > > # > # leer fichero CSV > # > def leer_datos(): > y =0 > lectura = csv.reader(open("data.csv", > for index,row in enumerate(lectura) > y +=1 > print 'Linea: ' + str(linea + 1) > print 'Temperatura' + row[0] + ', Humedad: ' + row[1] + ', > presion: ' + row[2] > > Me parece correcta la idea de recorrer el archivo hasta el final. La función enumerate() ya genera un índice y no es necesario inicializar `y` e incrementarlo en cada iteracción. Si se añade 1 como segundo argumento, el índice empieza por 1 en vez de en 0 así no hay que sumar 1. Para iterar por el bucle `for` sin hacer nada se puede utilizar instrucción `pass`. También creo que queda mejor utilizar la interpolación de cadenas en el print (el operador %) en vez de concatenar cadenas y valores. Quedaría así: f = open('data.csv') reader = csv.reader(f) for n, row in enumerate(reader, 1): pass print u'Línea %s' % n print u'Temperatura, %s, Humedad: %s, Presión: %s' % (row[0], row[1], row[2]) > gracias > > ___ > Python-es mailing list > Python-es@python.org > http://mail.python.org/mailman/listinfo/python-es > FAQ: http://python-es-faq.wikidot.com/ > -- Miguel González migonzal...@gmail.com PGP ID: EEBD05D3 ___ Python-es mailing list Python-es@python.org http://mail.python.org/mailman/listinfo/python-es FAQ: http://python-es-faq.wikidot.com/
Re: [Python-es] Leer ultima linea de fichero CSV?
2013/7/21 Juan > Hola, quiero leer solo la ultima linea de un fichero CSV (solo la linea que > se actualizo por ultima vez) y no tengo claro cual sería la mejor solución, > este es el código actual: > > # > # leer fichero CSV > # > def leer_datos(): > y =0 > lectura = csv.reader(open("data.csv", > for index,row in enumerate(lectura) > y +=1 > print 'Linea: ' + str(linea + 1) > print 'Temperatura' + row[0] + ', Humedad: ' + row[1] + ', > presion: ' + row[2] > > gracias > Hola, puedes usar deque (en el módulo collections) para simular un uso parecido al tail de algunos sistemas operativos: http://docs.python.org/2/library/collections.html#deque-recipes Lo siguiente funciona pensando que tu fichero csv tiene 3 columnas y está separado por comas. La función te devuelve los valores de cada columna como float. from collections import deque def tail(file): kk = deque(open(file), maxlen = 1) temp,hum,pres = kk[0].split('\n')[0].split(',') return float(temp), float(hum), float(pres) t, h, p = tail('tufichero.csv') # t, h, p es para temperatura, humedad y presión ___ 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] Leer ultima linea de fichero CSV?
Hola, quiero leer solo la ultima linea de un fichero CSV (solo la linea que se actualizo por ultima vez) y no tengo claro cual sería la mejor solución, este es el código actual: # # leer fichero CSV # def leer_datos(): y =0 lectura = csv.reader(open("data.csv", for index,row in enumerate(lectura) y +=1 print 'Linea: ' + str(linea + 1) print 'Temperatura' + row[0] + ', Humedad: ' + row[1] + ', presion: ' + row[2] gracias ___ Python-es mailing list Python-es@python.org http://mail.python.org/mailman/listinfo/python-es FAQ: http://python-es-faq.wikidot.com/