Generar planos

Chema Cortes py en ch3m4.org
Vie Feb 22 21:41:10 CET 2008


El Wednesday 20 February 2008 03:54:48 Manuel Enrique González Ramírez 
escribió:

> tengo una base de datos denominada prueba que contiene una tabla llamada
> ejm que esta compuesta
> por tres registros (apellido1,apellido2 y nombres).
>
> Lo que necesito es generar una consulta que me liste todos los registros y
> que a su vez los
> almacene en la unidad pero... (aquí es donde viene el rollo) al momento de
> ser almacenados
> éstos registro deben estar separados por espacios, por ejemplo el primer
> espacio que es para el
> campo APELLIDO1 no debe exceder de 12 caracteres, es decir, que por más
> largo que se el apellido1
> éste solo ubicara hasta un máximo de 12 caracteres; a partir de la
> "columna" 13 se ubicaría el
> apellido2 y éste ocuparía hasta la columna 25 y a partir de la 26 va el
> nombre.
>
> El formato sería más o menos así
> -------------------------------------------------
> Nombre Campo | Longitud | Posición | Tipo
> -------------------------------------------------
> APELLIDO1      | 12         | 01 a 12  | Alfanumerico
> APELLIDO2      | 12         | 13 a 25  | Alfanumerico
> NOMBRES        | 12         | 26 a 50  | Alfanumerico
>
>
> Un amigo de la lista me envio esta solución
>
> >>> "%-20s %-10s %-5s" % ("hola", "don", "tu")
>
> 'hola                don       tu   '
>
> [...]
>

Lo primero, sugerirte que mandes el mínimo de código que ilustre el problema. 
Harás que no perdamos tiempo en poder ayudarte. No era necesario todo el 
código sobre wx, que nada aportaba a centrar el problema.

>     def generar_da(self,event): #init function
>         #[62d]Code event VwX...Don't modify[62d]#
>         #add your code here
>         sql = c.execute('SELECT %-25s, %-25s FROM
> ejm'%('nombre','apellido'))

Ésto no está bien. El formato no tiene que ir en la consulta SQL; es después 
cuando tienes que tratar la información recibida.

         sql = c.execute('SELECT nombre, apellido FROM ejm')

>         res = c.fetchall()
>
>         if res<>None:
>             f = open('c:/guardar.dat','a')
>             for i in res:
>
>                 f.write(str(i[0]))
>                 f.write(str(i[1]+'\n'))

Aquí es donde debes formatear la cadena antes de enviarla al fichero:

   f.write("%-25s, %-25s\n" % i)

Por cierto, existe una forma más "pythónica" para hacer ésto (aunque no se usa 
mucho):

   print >>f, "%-25s, %-25s" % i

>
>             f.close()


Mejor aún sería trabajar con iteradores. Con los iteradores no se malgasta 
memoria guardando el resultado completo de la consulta antes de empezar a 
escribir en el fichero:

  sql = cur.execute('SELECT nombre, apellido FROM ejm')
  f = open('c:/guardar.dat','a')
  f.writelines("%-25s, %-25s\n" % row for row in cur)

Por último, y para rizar un poco más el rizo, para el problema de "truncar" el 
resultado, puedes emplear una función para truncar:

  def trunc(s,n):
    return s[:n].ljust(n)

  ...
  f.writelines(trunc(a)+trunc(b) for (a,b) in cur)
  
------------ próxima parte ------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 189 bytes
Desc: This is a digitally signed message part.
URL: <http://mail.python.org/pipermail/python-es/attachments/20080222/51887dba/attachment.pgp>
------------ próxima parte ------------
_______________________________________________
Lista de correo Python-es 
http://listas.aditel.org/listinfo/python-es
FAQ: http://listas.aditel.org/faqpyes


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