Las tabs en la impresión no son consistentes con python

Quiero tener tabs reales en una impresión pero \t solo pone espacios. P.ej:

  first:ThisIsLong second:Short first:Short second:ThisIsLong first:ThisIsEvenLonger second:Short 

¿Cómo lo arreglaría para poder tener todos los primeros y todos los segundos en fila? P.ej:

  first:ThisIsLong second:Short first:Short second:ThisIsLong first:ThisIsEvenLonger second:Short 

Puede utilizar el formato para alinear las cadenas en su lugar. Por ejemplo, puede decirle a python que la primera columna debe tener 20 caracteres de longitud, y la segunda debe ser 10, alineada a la izquierda.

Por ejemplo:

 string_one = 'first:ThisIsLong' string_two = 'second:Short' print( '{:<20s} {:<10s}'.format(string_one, string_two) ) 

imprimirá:

 first:ThisIsLong second:Short 

El primer descriptor de formato ( {:<20s} ) aquí está diciendo:

'<' alinear a la izquierda, 20 al menos 20 caracteres, s porque es una cadena

En lugar de usar la pestaña ( \t ), sugiero usar el formato de cadena usando el formato de estilo printf o el formato de str.format :

 rows = [ ['first:ThisIsLong', 'second:Short'], ['first:Short', 'second:ThisIsLong'], ['first:ThisIsEvenLonger', 'second:Short'], ] for first, second in rows: print('%-25s %s' % (first, second)) 

o

 print('{:<25} {}'.format(first, second)) 

La función de print Python envía cadenas a la salida estándar. Lo que hace la salida estándar con esas cadenas depende del dispositivo de salida. La interpretación predeterminada de \t es avanzar a la siguiente tabulación , que por convención es la posición del carácter que es el próximo múltiplo de 8 después de la posición en la que se produce \t (contando las posiciones de los caracteres desde la izquierda, empezando con 0).

Por ejemplo, si corro:

 babynames = [('kangaroo', 'joey'), ('fox', 'kit'), ('goose','gosling')] for x,y in babynames: print(x + '\t' + y) 

Yo obtengo:

 kangaroo joey fox kit goose gosling 

Tengo lo anterior en IDLE. kangaroo ocupa las columnas 0-7. \t está en la columna 8, por lo tanto, el siguiente múltiplo de 8 (la siguiente tabulación) después de la pestaña está en la columna 16, que es donde realmente se ve joey . En las siguientes dos líneas: la siguiente tabulación después de la primera palabra está en la columna 8. Esto muestra que (al menos en el shell IDLE) Python está usando tabs reales.

Las tabs en este sentido son algo molestas. Solo se pueden usar para alinear datos de cadena de longitud variable con una cierta cantidad de dificultad molesta. Como otros han indicado, la solución es no usar tabs, sino usar el format

Calcule el ancho máximo necesario para cada columna y luego use el formato de cadena para componer un formato que especifique el ancho deseado:

 data = [['first:ThisIsLong', 'second:Short'], ['first:Short', 'second:ThisIsLong'], ['first:ThisIsEvenLonger', 'second:Short']] widths = [max([len(item) for item in col]) for col in zip(*data)] fmt = ''.join(['{{:{}}}'.format(width+4) for width in widths]) for row in data: print(fmt.format(*row)) 

rendimientos

 first:ThisIsLong second:Short first:Short second:ThisIsLong first:ThisIsEvenLonger second:Short