Python: Formato de cadena de salida, alineación derecha


Estoy procesando un archivo de texto que contiene coordenadas x, y, z

     1      128  1298039
123388        0        2
....

Cada línea se delimita en 3 elementos usando

words = line.split()

Después de procesar los datos, necesito escribir las coordenadas en otro archivo txt para que los elementos de cada columna estén alineados a la derecha (así como el archivo de entrada). Cada línea se compone de las coordenadas

line_new = words[0]  + '  ' + words[1]  + '  ' words[2].

¿hay algún manipulador como std::setw() etc. en C++ permite establecer el ancho y la alineación?

Author: justik, 2011-11-23

5 answers

Pruebe este enfoque utilizando la nueva str.format sintaxis :

line_new = '{:>12}  {:>12}  {:>12}'.format(word[0], word[1], word[2])

Y aquí está cómo hacerlo usando la antigua sintaxis % (útil para versiones anteriores de Python que no admiten str.format):

line_new = '%12s  %12s  %12s' % (word[0], word[1], word[2])
 163
Author: Mark Byers,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-12-08 23:51:43

Puedes alinearlo así:

print('{:>8} {:>8} {:>8}'.format(*words))

Donde > significa " alinear a la derecha" y 8 es la anchura para un valor específico.

Y aquí hay una prueba:

>>> for line in [[1, 128, 1298039], [123388, 0, 2]]:
    print('{:>8} {:>8} {:>8}'.format(*line))


       1      128  1298039
  123388        0        2

Ps. *line significa que la lista line se desempaquetará, por lo que .format(*line) funciona de manera similar a .format(line[0], line[1], line[2]) (suponiendo que line es una lista con solo tres elementos).

 40
Author: Tadeck,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-05-27 21:43:24

Se puede lograr usando rjust:

line_new = word[0].rjust(10) + word[1].rjust(10) + word[2].rjust(10)
 32
Author: clwen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-11-22 22:21:50

Tabulación simple de la salida:

a = 0.3333333
b = 200/3
print("variable a    variable b")
print("%10.2f    %10.2f" % (a, b))

Salida:

variable a    variable b
      0.33         66.67

%10.2 f: 10 es la longitud mínima y 2 es el número de decimales.

 2
Author: Thoran,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-04-14 13:44:23

Realmente disfruto de una nueva interpolación de cadena literal en Python 3.6+:

line_new = f'{word[0]:>12}  {word[1]:>12}  {word[2]:>12}'

Referencia: PEP 498 Interp Interpolación Literal de cadena

 1
Author: dmitry_romanov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-08-30 12:15:48