格式化输出字符串,右对齐


149

我正在处理一个包含坐标x,y,z的文本文件

     1      128  1298039
123388        0        2
....

每行使用

words = line.split()

处理完数据后,我需要将坐标写回到另一个txt文件中,以使每一列中的项目(以及输入文件)都正确对齐。每行由坐标组成

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

std::setw()C ++中是否有任何类似操纵器的控件可以设置宽度和对齐方式?

Answers:


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旧方法更干净的一种方法是使用更少的字符。是的,熟悉的情况下,新方法变得直观了,但并不更简洁。对于那些习惯于通过古老的C语言(示例性的简洁和精确的语言)出现的语法的人来说,旧方法更加直观。新方法有什么先例?
斯蒂芬·波士顿,

2
@StephenBoston我将让专家保持可读性,但是新方法绝对更干净。括号不再是可选的。%可以与数学运算符混淆(尽管这不太可能在上下文中,但一目了然)。如果word [n]不是预期的类型(在这种情况下为字符串),则旧方法将失败。新方法不需要知道传入的类型是什么,它总是有效的。干净简单。公平地讲,我从来没有对printf样式感到满意(我大多使用Cout编写C)。
Zim

53

可以使用rjust以下方法实现:

line_new = word[0].rjust(10) + word[1].rjust(10) + word[2].rjust(10)

51

您可以像这样对齐它:

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

附言 *line表示该line列表将被解压缩,因此其.format(*line)工作方式类似于.format(line[0], line[1], line[2])(假设line一个仅包含三个元素的列表)。



18

这是使用“ 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]}",我想达到上述目标。
TomaszSabała19年

1
得到它了!也许有人会觉得有用。为此,我还需要一个嵌套的括号:f"{'Trades:':<{width[0]}}{cnt:>{width[1]}}"
TomaszSabała19年

1
有时最好的答案是那些没有回答确切问题的答案。谢谢你!:)
Brian Wiley

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是小数位数。


1

要使用f字符串并控制尾随数字的数量,请执行以下操作:

print(f'A number -> {my_number:>20.5f}')
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.