elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Curso de javascript por TickTack


+  Foro de elhacker.net
|-+  Programación
| |-+  Scripting
| | |-+  Python ordenamiento a la hora de impresion
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Python ordenamiento a la hora de impresion  (Leído 3,277 veces)
metalost

Desconectado Desconectado

Mensajes: 10


Ver Perfil
Python ordenamiento a la hora de impresion
« 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)


« Última modificación: 21 Mayo 2017, 04:56 am por metalost » En línea

Once

Desconectado Desconectado

Mensajes: 120


Ver Perfil WWW
Re: Python ordenamiento a la hora de impresion
« Respuesta #1 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í:


Saludos.


« Última modificación: 21 Mayo 2017, 05:46 am por Once » En línea

metalost

Desconectado Desconectado

Mensajes: 10


Ver Perfil
Re: Python ordenamiento a la hora de impresion
« Respuesta #2 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:
« Última modificación: 21 Mayo 2017, 16:36 pm por metalost » En línea

tincopasan


Desconectado Desconectado

Mensajes: 1.286

No es lo mismo conocer el camino que recorrerlo.


Ver Perfil
Re: Python ordenamiento a la hora de impresion
« Respuesta #3 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.
En línea

Once

Desconectado Desconectado

Mensajes: 120


Ver Perfil WWW
Re: Python ordenamiento a la hora de impresion
« Respuesta #4 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.
En línea

LaThortilla (Effort)

Desconectado Desconectado

Mensajes: 234


¿En que vida harás lo que en esta no?


Ver Perfil WWW
Re: Python ordenamiento a la hora de impresion
« Respuesta #5 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.  


« Última modificación: 28 Mayo 2017, 02:25 am por Effort » En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Metodos de Ordenamiento en c#
.NET (C#, VB.NET, ASP)
alexvem 0 38,731 Último mensaje 4 Agosto 2008, 18:02 pm
por alexvem
Metodos de Ordenamiento
Programación Visual Basic
...:::Téotl:::... 4 13,548 Último mensaje 15 Junio 2012, 22:55 pm
por raul338
Obtengo la hora 1 hora adelantada WTF!?
PHP
[u]nsigned 0 1,640 Último mensaje 18 Febrero 2016, 22:36 pm
por [u]nsigned
(Python 3.5) Hacer una accion a una determinada hora
Scripting
BigKaz 5 3,921 Último mensaje 10 Diciembre 2016, 19:01 pm
por antkk
Python, espacios para impresion en pantalla
Scripting
metalost 1 2,762 Último mensaje 21 Mayo 2017, 01:08 am
por engel lex
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines