Format wyjściowy ciąg, 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: codeforester, 2011-11-22

7 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])
 247
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żna to osiągnąć za pomocą rjust:

line_new = word[0].rjust(10) + word[1].rjust(10) + word[2].rjust(10)
 56
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

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).

 56
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

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

 30
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

Oto inny sposób formatowania za pomocą formatu 'f-string':

print(
    f"{'Trades:':<15}{cnt:>10}",
    f"\n{'Wins:':<15}{wins:>10}",
    f"\n{'Losses:':<15}{losses:>10}",
    f"\n{'Breakeven:':<15}{evens:>10}",
    f"\n{'Win/Loss Ratio:':<15}{win_r:>10}",
    f"\n{'Mean Win:':<15}{mean_w:>10}",
    f"\n{'Mean Loss:':<15}{mean_l:>10}",
    f"\n{'Mean:':<15}{mean_trd:>10}",
    f"\n{'Std Dev:':<15}{sd:>10}",
    f"\n{'Max Loss:':<15}{max_l:>10}",
    f"\n{'Max Win:':<15}{max_w:>10}",
    f"\n{'Sharpe Ratio:':<15}{sharpe_r:>10}",
)

To dostarczy następujące Wyjście:

Trades:              2304
Wins:                1232
Losses:              1035
Breakeven:             37
Win/Loss Ratio:      1.19
Mean Win:           0.381
Mean Loss:         -0.395
Mean:               0.026
Std Dev:             0.56
Max Loss:          -3.406
Max Win:             4.09
Sharpe Ratio:      0.7395

Mówisz, że pierwsza kolumna ma długość 15 znaków i jest w lewo uzasadniona, a druga kolumna (wartości) ma długość 10 znaków i jest w prawo uzasadniona.

 28
Author: Vlad Bezden,
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
2019-03-03 13:20:12

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.

 6
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

Aby to zrobić za pomocą f-string i z kontrolą liczby końcowych cyfr:

print(f'A number -> {my_number:>20.5f}')
 2
Author: Learning is a mess,
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
2019-10-15 15:56:23