Python: формат выходной строки, выравнивание по правому краю - PullRequest
130 голосов
/ 23 ноября 2011

Я обрабатываю текстовый файл, содержащий координаты x, y, z

     1      128  1298039
123388        0        2
....

каждая строка разделена на 3 элемента с использованием

words = line.split()

После обработки данных мне нужно записать координаты обратно в другой текстовый файл, чтобы элементы в каждом столбце были выровнены по правому краю (а также во входном файле). Каждая строка состоит из координат

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

Есть ли в C ++ такой манипулятор, как std::setw() и т. Д., Позволяющий установить ширину и выравнивание?

Ответы [ 6 ]

192 голосов
/ 23 ноября 2011

Попробуйте этот подход, используя более новый str.format синтаксис :

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

А вот как это сделать, используя старый синтаксис % (полезно для старых версий Pythonне поддерживает str.format):

line_new = '%12s  %12s  %12s' % (word[0], word[1], word[2])
45 голосов
/ 23 ноября 2011

Вы можете выровнять его следующим образом:

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

, где > означает « выравнивать вправо », а 8 - это ширина для конкретногозначение.

А вот и доказательство:

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


       1      128  1298039
  123388        0        2

Ps.*line означает, что список line будет распакован, поэтому .format(*line) работает аналогично .format(line[0], line[1], line[2]) (при условии, что line - список только с тремя элементами).

43 голосов
/ 23 ноября 2011

Это может быть достигнуто с помощью rjust:

line_new = word[0].rjust(10) + word[1].rjust(10) + word[2].rjust(10)
14 голосов
/ 30 августа 2018

Мне действительно нравится новая интерполяция буквенных строк в Python 3.6 +:

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

Ссылка: PEP 498 - Интерполяция буквенных строк

5 голосов
/ 14 апреля 2016

Простая табуляция вывода:

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

выход:

variable a    variable b
      0.33         66.67

% 10.2f: 10 - минимальная длина, а 2 - количество десятичных знаков.

4 голосов
/ 03 марта 2019

Вот еще один способ форматирования с использованием формата '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}",
)

Это обеспечит следующий вывод:

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

То, что вы делаете здесь, этоВы говорите, что первый столбец имеет длину 15 символов и выровнен по левому краю, а второй столбец (значения) - 10 символов и выровнен по правому краю.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...