Python: Format wyjściowego ciągu, wyrównanie w prawo

Przetwarzam plik tekstowy zawierający współrzędne x, y, z

     1      128  1298039
123388        0        2
....

Każdy wiersz jest rozdzielany na 3 elementy za pomocą

words = line.split()

Po przetworzeniu danych muszę zapisać współrzędne w innym pliku txt, aby pozycje w każdej kolumnie były wyrównane w prawo (jak również w pliku wejściowym). Każda linia składa się ze współrzędnych

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

Czy jest jakiś manipulator jak std::setw() itp. w C++ pozwala ustawić szerokość i wyrównanie?

Author: justik, 2011-11-23

5 answers

Wypróbuj to podejście używając nowszego str.format składnia :

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

A oto jak to zrobić używając starej składni % (przydatnej dla starszych wersji Pythona, które nie obsługują 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/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-08 23:51:43

Możesz wyrównać tak:

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

Gdzie > oznacza " align to right", a 8 jest width dla konkretnej wartości.

A oto dowód:

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


       1      128  1298039
  123388        0        2

Ps. *line oznacza, że lista line zostanie rozpakowana, więc .format(*line) działa podobnie do .format(line[0], line[1], line[2]) (zakładając, że line jest listą zawierającą tylko trzy elementy).

 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/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-27 21:43:24

Można to osiągnąć za pomocą 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/doraprojects.net/template/agent.layouts/content.php on line 54
2011-11-22 22:21:50

Prosta tabulacja wyjścia:

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

Wyjście:

variable a    variable b
      0.33         66.67

%10.2 f: 10 to minimalna długość, a 2 to liczba miejsc po przecinku.

 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/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-14 13:44:23

Naprawdę lubię nową interpolację ciągów literalnych w Pythonie 3.6+:

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

Reference: PEP 498 -- literalna Interpolacja ciągu

 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/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-30 12:15:48