Формат выходной строки, выравнивание по правому краю

149

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

     1      128  1298039
123388        0        2
....

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

words = line.split()

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

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

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

Justik
источник

Ответы:

230

Попробуйте этот подход, используя новый 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])
Марк Байерс
источник
39
Обратите внимание, что «старый» синтаксис чище, проще для чтения и короче.
fyngyrz
2
Я подумал, что добавлю более прямую ссылку, чем предоставленная: docs.python.org/2/library/…
brw59
48
Короче говоря, я не знаю, что на самом деле означает очиститель, но «легче читать», потому что я думаю, он знаком. Если вы еще не знакомы с одним из них, новый формат легче читать. «.format» для форматирования строк, безусловно, кажется более интуитивным, чем процент / по модулю. Стрелка вправо для выравнивания вправо также кажется довольно интуитивной.
Марка
2
@Mark. Одним из способов, которыми старый способ является более чистым, является использование меньшего количества символов. Да, со знакомством новый способ становится интуитивно понятным, но он не чище и не проще. Старый способ более интуитивен для тех, кто привык к синтаксису, который приходит к нам через почтенный язык Си, язык образцовой краткости и точности. Какой прецедент есть для нового пути?
Стивен Бостон
2
@StephenBoston Я оставлю читабельность экспертам, но новый способ абсолютно чище. Парены больше не являются обязательными. % можно спутать с математическим оператором (хотя и не в контексте, но с уверенностью). Старый способ потерпит неудачу, если слово [n] не относится к ожидаемому типу (в данном случае это строка). Новый способ не должен знать, что является входящим типом, он всегда работает. Чисто и просто. Честно говоря, я никогда не чувствовал себя комфортно в стиле printf (в основном я делал C с cout).
Зим
53

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

line_new = word[0].rjust(10) + word[1].rjust(10) + word[2].rjust(10)
clwen
источник
52

Вы можете выровнять это так:

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, что список состоит только из трех элементов).

Tadeck
источник
19

Вот еще один способ форматирования с использованием формата '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 символов и выровнен по правому краю.

Влад Безден
источник
Есть ли способ параметризации ширины форматов? В этом примере, если вы решите изменить форматирование на 20 и 15 ширины, требуется изменить несколько строк. widths = [15, 10] f"{'Trades:':<width[0]}{cnt:>width[1]}",Я хотел бы достичь чего-либо, как указано выше.
Томаш Сабала
1
Понял! Может быть, кто-то найдет это полезным. Для этого мне понадобятся еще несколько вложенных скобок:f"{'Trades:':<{width[0]}}{cnt:>{width[1]}}"
Томаш Сабала
1
Иногда лучшие ответы - это те, которые не отвечают на точный вопрос. Спасибо за это! :)
Брайан Уайли
5

Простая таблица результатов:

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 - количество десятичных знаков.

Thoran
источник
1

Чтобы сделать это с помощью f-строки и с контролем количества конечных цифр:

print(f'A number -> {my_number:>20.5f}')
Учиться беспорядок
источник