Re: [Python-es] Leer ultima linea de fichero CSV?

2013-07-22 Por tema Juan
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?

2013-07-22 Por tema Juan BC
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?

2013-07-22 Por tema Chema Cortes
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?

2013-07-22 Por tema Xavi

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?

2013-07-21 Por tema Juan BC
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?

2013-07-21 Por tema Angel Claudio Alvarez
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?

2013-07-21 Por tema Miguel González Álvarez
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-07-21 Por tema Kiko
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?

2013-07-21 Por tema 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

___
Python-es mailing list
Python-es@python.org
http://mail.python.org/mailman/listinfo/python-es
FAQ: http://python-es-faq.wikidot.com/