leer datos

Chema Cortés py en ch3m4.org
Mie Sep 29 18:08:20 CEST 2004


On Wednesday 29 September 2004 17:22, Nan loz wrote:
> Chema,
> lo que he hecho hasta ahora es transformar mis datos a csv y usar ese
> modulo, pero quisiera saber si hay alguna forma de leer los datos sin usar
> un separador (tab o comas etc) sino definiendo los campos directamente en
> python para evitarme el paso intermedio. Gracias

A ver si entiendo bien: lo que realmente tienes es un fichero cuyos registros 
son campos de tamaño fijo, nada de csv ni parecido.

El algoritmo consistiría en cortar cada línea en los pedazos que necesites 
para cada campo, algo así:


regdef=( #field name, length
         ("seer reg", 2),
         ("case no",  8),
         ("rec no",   2)
)

def troceo(lin, rdef):
  res=[0]*len(rdef)
  ini=0
  for pos,(name,length) in enumerate(rdef):
    res[pos]=lin[ini:ini+length]
    ini+=length
  return res


for lin in file("fichero.txt"):
  registro=troceo(lin,regdef)
  #...
  #procesar cada registro
  #  "seer reg" --> registro[0]
  #  "case no"  --> registro[1]
  #  "rec no"   --> registro[2]



Se puede sofisticar un poco más, con la función troceo devolviendo un 
diccionario que además convierta tipos:


regdef=( #field name, length, cast
         ("seer reg", 2, str),
         ("case no",  8, float),
         ("rec no",   2, int)
)

def troceo(lin, rdef):
  res={}
  ini=0
  for pos,(name,length,cast) in enumerate(rdef):
    res[name]=cast(lin[ini:ini+length])
    ini+=length
  return res


for lin in file("fichero.txt"):
  registro=troceo(lin,regdef)
  #...
  #procesar cada registro
  #  "seer reg" --> registro["seer reg"] str
  #  "case no"  --> registro["case no"]  float
  #  "rec no"   --> registro["rec no"]   int



Si necesitas un tipo "date", por algún motivo, puedes emplear esta función 
'cast', aunque existen mejores alternativas (pe: el módulo 'mx.datetime'):

from datetime import date

def datecast(fecha):
  #formato fecha: DD/MM/YYYY
  (d,m,y)=fecha.split("/")
  return date(int(y),int(m),int(d))

Y si necesitas un tipo "decimal" para cantidades monetarias, hace unos días 
hubo un mensaje de Facundo Batista sobre ello.

Espero que te sea de utilidad.

------------ próxima parte ------------
A non-text attachment was scrubbed...
Name: no disponible
Type: application/pgp-signature
Size: 189 bytes
Desc: no disponible
URL: <http://mail.python.org/pipermail/python-es/attachments/20040929/cef03443/attachment.pgp>
------------ próxima parte ------------
_______________________________________________
Python-es mailing list
Python-es en aditel.org
http://listas.aditel.org/listinfo/python-es


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