Foro de elhacker.net

Programación => Scripting => Mensaje iniciado por: metalost en 21 Mayo 2017, 04:53 am



Título: Python ordenamiento a la hora de impresion
Publicado por: metalost en 21 Mayo 2017, 04:53 am
Código
  1.  
  2. #-*-coding:utf-8-*-
  3. archi=open('datos.txt','a')
  4. idss= 0
  5. ids =[]
  6. nombres =[]
  7. apellido=[]
  8. CID=[]
  9. Direccion=[]
  10. telefono=[]
  11. x=1
  12. while x!=0:
  13. idss+=1
  14. nomb = raw_input("Ingrese su nombre: ")
  15. nombres.append(nomb)
  16. apell= raw_input ("Ingrese el apellido: ")
  17. apellido.append(apell)
  18. Cde= raw_input ("Ingrese su Cedula: ")
  19. CID.append(Cde)
  20. direc= raw_input ("Ingrese su direccion: ")
  21. Direccion.append(direc)
  22. tlf = raw_input("Ingrese su numero de telefono: ")
  23. telefono.append(tlf)
  24. ids.append(idss)
  25. ingreso=raw_input("Desea ingresar alguien mas? S/N: ")
  26. if ingreso== "N" or ingreso == "n":
  27. x=0
  28. txta=str(idss) +") " +nomb+" "+apell+" "+Cde+ " "+direc+ " "+tlf
  29. archi.write(txta)
  30. archi.write("\n")
  31.  
  32. archi.close()
  33.  
  34.  


El programa como se puede apreciar, recolecta una serie de datos, y las añade a un archivo .txt pero... tengo un problema y es que se supone que cada dato, debe estar bajo una columna de su respectiva sección... Ejemplo "Nombre" deberia mostrarse asi como

    Nombre       Apellido       Telefono
  1)  pepe           castellano     999912
  2) felipe           manriquefortiquepalacios  92399123123

como pueden ver, si ejecutamos el programa suponiendo que coloquemos de manera manual en el txt la parte de nombre, apellido y telefono, de manera que ya el codigo coloque los datos, existe el problema de que pase como en el ejemplo la parte 2) que, los caracteres exceden su campo, dezplasando asi al siguiente y descuadrando la tabla del .txt ... necesito solucionar especificamente este problema con el .txt

Mi pregunta es si hay algun comando que diga que si se hay tantos caracteres haga un salto de linea, de manera que, no invada al campo siguiente o algo asi... ¿Que solucion me recomiendan? (Como pueden ver, esta en Python 2)


Título: Re: Python ordenamiento a la hora de impresion
Publicado por: Once en 21 Mayo 2017, 05:43 am
Así por encima, loq ue se me ocurre que puedes hacer es, no guardar los datos en el archivo de texto sino hasta que ya los tengas todos recolectados, éstos los vas guardando (puede ser en listas) y una vez tienes los datos guardados, buscas en las listas los que tienen mayor longitud y usas ese dato para generar la cantidad de espacios que separen cada columna.


Edit: No creo que me explicara muy bien, así que te dejo este ejemplo (fue lo primero que se me ocurió) sólo adáptalo a tu necesidad.

Código
  1. columna_uno = ["hola", "soy", "Once"]
  2. columna_dos = ["Esta", "es", "una"]
  3.  
  4. max_columna_uno = max(map(len, columna_uno))
  5. max_columna_dos = max(map(len, columna_dos))
  6.  
  7. for e1, e2 in zip(columna_uno, columna_dos):
  8.    print("|{0}|{1}|".format(e1.ljust(max_columna_uno + 1), e2.ljust(max_columna_dos + 1)))
  9.  



El resultado es algo así:


  (http://imgur.com/AMIbin5l.png)
 (http://i.imgur.com/AMIbin5.png)

Saludos.


Título: Re: Python ordenamiento a la hora de impresion
Publicado por: metalost en 21 Mayo 2017, 16:23 pm
Gracias por tu solucion once, pero creo que no me sirve del todo, porque lo necesito añadir todo a un .txt, y ese .txt, deberi apoder añadir mas informacion...  es decir, cerrarlo, abrirlo, que mantenga la informacion que ya tenia, y agregar mas sin que se descuadre nuestro "Cuadro" Alguna otra solucion?   Muchas gracias por su ayuda  ;D ;D ;D

Estaba pensando en algo que usara el

Código
  1. max_columna_uno = max(map(len, columna_uno))
  2.  

Pero con una condicion, que si excede x numero de caracteres, haga un salto de linea, ¿Eso se podria hacer? :huh:


Título: Re: Python ordenamiento a la hora de impresion
Publicado por: tincopasan en 22 Mayo 2017, 12:22 pm
partamos de la base que desde el inicio ya está incompleto, deberías haber asignado el espacio que quieres que ocupe cada item(nombre,apellido,etc).
Imagina que creas una tabla, le asignas el tamaño justamente para que no se pisen los datos.
en resumen podrías agregar la línea:
Código
  1. nomb = input("Ingrese su nombre: ")
  2. nomb='{:10}'.format(nomb) #acá le doy 10 lugares al nombre, claro que esto es a tu criterio
  3. nombres.append(nomb)
  4.  

de esta simple forma quedan ordenados con un espacio asignado.


Título: Re: Python ordenamiento a la hora de impresion
Publicado por: Once en 23 Mayo 2017, 06:55 am
En ese caso, no te sirve formatear antes de agregar la información al archivo, ya que no sabes que información va a ir a continuación. (Por eso en el ejemplo que te puse arriba, necesitabas la lista con la info [bcompleta[/b])

Para solucionarlo en tu caso, tendrías que, cada tanto, estar abriendo el archivo, leer la información que está ahí, formatearla y guardar de nuevo la información ya formateada en el archivo.

Ahora, para saber si la cadena se pasa de una cantidad de caracteres específica, usa la función len(cadena) y un condicional, para agregar una nueva línea, lo puedes hacer imprimiendo: "\r\n"

Saludos.


Título: Re: Python ordenamiento a la hora de impresion
Publicado por: LaThortilla (Effort) en 28 Mayo 2017, 02:19 am
 Fácil compañero....

A mi forma de ver lo que quieres en si.... es almacenar información de manera estructurada?

si es así, la solución más apropiada seria la que te ofrecio Once... aun que yo agregaría un separador   más complejo o filtraria lo que ingresa el usuario :silbar:.... por que esto puede modificar la estructura de tu base... algo asi como el SQL injection.

Código
  1.    print("|{0}|{1}|".format(e1.ljust(max_columna_uno + 1), e2.ljust(max_columna_dos + 1)))
  2.  

pero si lo que quieres es solo que se vea chulo en tu archivo pues usa como separador el caracter de tabulador


Código
  1. txta = "{0}\t{1}".format(e1.ljust(max_columna_uno + 1), e2.ljust(max_columna_dos + 1))
  2. archi.write(txta)
  3. archi.write("\n")
  4.