Python ordenamiento a la hora de impresion

Iniciado por metalost, 21 Mayo 2017, 04:53 AM

0 Miembros y 1 Visitante están viendo este tema.

metalost

Código (python) [Seleccionar]


#-*-coding:utf-8-*-
archi=open('datos.txt','a')
idss= 0
ids =[]
nombres =[]
apellido=[]
CID=[]
Direccion=[]
telefono=[]
x=1
while x!=0:
idss+=1
nomb = raw_input("Ingrese su nombre: ")
nombres.append(nomb)
apell= raw_input ("Ingrese el apellido: ")
apellido.append(apell)
Cde= raw_input ("Ingrese su Cedula: ")
CID.append(Cde)
direc= raw_input ("Ingrese su direccion: ")
Direccion.append(direc)
tlf = raw_input("Ingrese su numero de telefono: ")
telefono.append(tlf)
ids.append(idss)
ingreso=raw_input("Desea ingresar alguien mas? S/N: ")
if ingreso== "N" or ingreso == "n":
x=0
txta=str(idss) +") " +nomb+" "+apell+" "+Cde+ " "+direc+ " "+tlf
archi.write(txta)
archi.write("\n")

archi.close()




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)

Once

#1
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 (python) [Seleccionar]
columna_uno = ["hola", "soy", "Once"]
columna_dos = ["Esta", "es", "una"]

max_columna_uno = max(map(len, columna_uno))
max_columna_dos = max(map(len, columna_dos))

for e1, e2 in zip(columna_uno, columna_dos):
    print("|{0}|{1}|".format(e1.ljust(max_columna_uno + 1), e2.ljust(max_columna_dos + 1)))




El resultado es algo así:


Saludos.

metalost

#2
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 (python) [Seleccionar]

max_columna_uno = max(map(len, columna_uno))


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

tincopasan

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 (python) [Seleccionar]

nomb = input("Ingrese su nombre: ")
nomb='{:10}'.format(nomb) #acá le doy 10 lugares al nombre, claro que esto es a tu criterio
nombres.append(nomb)


de esta simple forma quedan ordenados con un espacio asignado.

Once

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.

LaThortilla (Effort)

#5
 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.

Cita de: Once en 21 Mayo 2017, 05:43 AM
Código (python) [Seleccionar]

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


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


Código (python) [Seleccionar]
txta = "{0}\t{1}".format(e1.ljust(max_columna_uno + 1), e2.ljust(max_columna_dos + 1))
archi.write(txta)
archi.write("\n")