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

Python 格式化输出字符串,右对齐,python,alignment,string-formatting,Python,Alignment,String Formatting,我正在处理一个包含坐标x,y,z的文本文件 1 128 1298039 123388 0 2 .... 每行使用分隔符分隔为3个项目 words = line.split() 处理完数据后,我需要将坐标写回另一个txt文件中,以便每列中的项目都正确对齐(以及输入文件)。每条线都由坐标组成 line_new = words[0] + ' ' + words[1] + ' ' words[2]. 有任何机械手,如代码> STD::SET

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

     1      128  1298039
123388        0        2
....
每行使用分隔符分隔为3个项目

words = line.split()
处理完数据后,我需要将坐标写回另一个txt文件中,以便每列中的项目都正确对齐(以及输入文件)。每条线都由坐标组成

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

有任何机械手,如代码> STD::SETWWER(/CUT>)等,允许在C++中设置宽度和对齐方式?

< P>使用新的方法:< /P>尝试此方法。 下面介绍如何使用旧的
%
语法(对于不支持
str.format
的旧版本Python非常有用):


可以通过使用
rjust

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

您可以这样对齐它:

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.
*行
意味着
列表将被解包,因此
.format(*line)
的工作原理类似于
.format(行[0],行[1],行[2])
(假设
是一个只有三个元素的列表)。

输出的简单列表:

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

我非常喜欢Python 3.6+中新的文本字符串插值:

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

参考资料:

以下是使用“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}",
)

这里您要做的是,第一列长度为15个字符,左对齐,第二列(值)长度为10个字符,右对齐。

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

print(f'A number -> {my_number:>20.5f}')

将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

注意“旧”语法是如何更简洁、更容易阅读和更短的。我想我应该添加一个比提供的更直接的链接:当然更短,我不知道cleaner真正的意思,但“更容易阅读”只是因为我觉得它很熟悉。如果您还不熟悉其中一种格式,那么新格式似乎更容易阅读。字符串格式的“.format”显然比百分比/模更直观。右对齐的右箭头看起来也很直观。@标记一种方法旧方法更干净,它使用的字符更少。是的,随着熟悉程度的提高,新方法变得直观,但它并不干净和简单。对于那些习惯于通过古老的C语言(一种堪称典范的简洁和精确的语言)向我们介绍语法的人来说,旧方法更直观。新方法有什么先例?@StephenBoston我将把可读性留给专家,但新方法绝对更干净。参数不再是可选的。%可能会与数学运算符混淆(虽然在上下文中不太可能,但乍一看是肯定的)。如果字[n]不是预期的类型(本例中为字符串),则旧方法将失败。新方法不需要知道传入的类型是什么,它总是有效的。干净简单。平心而论,我从来没有对printf样式感到满意过(我主要是用cout编写C)。有没有办法参数化格式的宽度?在本例中,如果决定将格式更改为20和15宽度,则需要更改多行
widths=[15,10]
f“{'Trades:':width[1]},
我想实现上述目标。明白了!也许有人会觉得这很有帮助。我还需要一个嵌套的括号,所以:
f“{'Trades:':{width[1]}}”
有时候最好的答案是那些没有回答确切问题的答案。谢谢你!:)@完全正确!我也希望格式化字符串文本。我总是忘了“字符串中的字符串”的用法(即使用“''`inside```)。
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
print(f'A number -> {my_number:>20.5f}')
>>> 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