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

214

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

     1      128  1298039
123388        0        2
....

每一行都使用分隔符将其分为3个项目

words = line.split()

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

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

在C++中是否有类似于std::setw()的操作器,允许设置宽度和对齐方式?

8个回答

314

尝试使用更新的 str.format 语法 来实现此方法:

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

下面是使用旧的%语法的方法(适用于不支持str.format的较旧版本Python):

line_new = '%12s  %12s  %12s' % (word[0], word[1], word[2])

55
请注意,“旧”语法更加简洁、易读和短小。 - fyngyrz
4
我想添加一个比提供的更直接的链接:https://docs.python.org/2/library/string.html#format-specification-mini-language - brw59
67
肯定更短,我不知道“更清晰”真正意味着什么,但“更易读”只是因为它熟悉,我认为。如果你还不熟悉其中之一,新的格式似乎更容易阅读。字符串格式化使用“.format”肯定比百分号/模数更直观。右箭头表示右对齐也非常直观。 - Mark
4
“旧方式”更加简洁的原因之一是使用的字符较少。是的,随着熟悉度的增加,新方式会变得更加直观,但并不比旧方式更加简洁和清晰。对于那些习惯于通过备受推崇的C语言语法传达信息的人来说,“旧方式”更加直观,C语言以其简洁精准而著称。那么,新方式有什么先例吗? - Stephen Boston
4
@StephenBoston 我会将可读性留给专家,但是新的方法绝对更清晰。括号不再是可选的。% 可以与数学运算符混淆(尽管在上下文中可能性不大,但一眼看去肯定)。旧方法如果 word[n] 不是预期类型(在这种情况下为字符串),则会失败。新方法不需要知道传入类型是什么,它总是有效的。干净简单。公正地说,我从来没有适应 printf 风格(我主要使用 C 和 cout)。 - Zim
显示剩余7条评论

78

您可以这样对齐:

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 是一个只有三个元素的列表)。


74

以下是使用"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个字符,右对齐。

如果您要连接列表中的项目并希望格式化项目之间的空格,则可以使用“`”和常规格式化技术。

此示例通过3个空格分隔每个数字。关键是f"{'':>3}"

print(f"{'':>3}".join(str(i) for i in range(1, 11)))

输出:

1   2   3   4   5   6   7   8   9   10

2
有没有一种方法可以将格式的宽度参数化?在这个例子中,如果您决定将格式更改为20和15宽度,则需要更改多行。widths = [15, 10]我想实现类似上面的东西。f"{'Trades:':<width[0]}{cnt:>width[1]}", - Tomasz Sabała
5
明白了!也许有人会觉得这很有用。我需要为此再加一个嵌套括号,代码如下:f"{'Trades:':<{width[0]}}{cnt:>{width[1]}}" - Tomasz Sabała
2
有时候最好的答案并不是直接回答问题。谢谢你! :) - Brian Wiley
@BrianWiley 没错!我也一直在寻找格式化字符串字面量的方法。我总是忘记“字符串中的字符串”技巧(即在 " " 中使用 ' ')。 - pfabri

67

可以通过使用 rjust 实现:

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

39

我非常喜欢Python 3.6+中的一种新的文本字符串内插方式:

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

参考文献: PEP 498 -- 字面字符串插值


7

简单的输出选项卡:

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


7
使用f-string并控制小数点后的位数,可以实现此操作:
print(f'A number -> {my_number:>20.5f}')

0
混合Vlad的优秀内容和其他内容,代码也可以像...一样编写,以便读取和使用。
>>> cnt = wins = losses      = str(   2)
>>> evens = win_r = mean_w   = str(  14)
>>> mean_l = mean_trd = sd   = str( 336)
>>> max_l = max_w = sharpe_r = str(4278)
>>>
>>> rpad = 10
>>>
>>> print(
...     '\n Trades         ' +      cnt.rjust(rpad),
...     '\n Wins           ' +     wins.rjust(rpad),
...     '\n Losses         ' +   losses.rjust(rpad),
...     '\n Breakeven      ' +    evens.rjust(rpad),
...     '\n Win/Loss Ratio ' +    win_r.rjust(rpad),
...     '\n Mean Win       ' +   mean_w.rjust(rpad),
...     '\n Mean Loss      ' +   mean_l.rjust(rpad),
...     '\n Mean           ' + mean_trd.rjust(rpad),
...     '\n Std Dev        ' +       sd.rjust(rpad),
...     '\n Max Loss       ' +    max_l.rjust(rpad),
...     '\n Max Win        ' +    max_w.rjust(rpad),
...     '\n Sharpe Ratio   ' + sharpe_r.rjust(rpad),
... )

 Trades                  2
 Wins                    2
 Losses                  2
 Breakeven              14
 Win/Loss Ratio         14
 Mean Win               14
 Mean Loss             336
 Mean                  336
 Std Dev               336
 Max Loss             4278
 Max Win              4278
 Sharpe Ratio         4278

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接