【问题标题】:How to left align a fixed width string?如何左对齐固定宽度的字符串?
【发布时间】:2012-10-02 04:03:09
【问题描述】:

我只想要固定宽度的文本列,但字符串都向右填充,而不是向左填充!!?

 sys.stdout.write("%6s %50s %25s\n" % (code, name, industry))

生产

BGA                                BEGA CHEESE LIMITED   Food Beverage & Tobacco
BHP                               BHP BILLITON LIMITED                 Materials
BGL                               BIGAIR GROUP LIMITED Telecommunication Services
BGG           BLACKGOLD INTERNATIONAL HOLDINGS LIMITED                    Energy

但我们想要

BGA BEGA CHEESE LIMITED                                Food Beverage & Tobacco
BHP BHP BILLITON LIMITED                               Materials
BGL BIGAIR GROUP LIMITED                               Telecommunication Services
BGG BLACKGOLD INTERNATIONAL HOLDINGS LIMITED           Energy

【问题讨论】:

  • 太棒了!谢谢...它必须非常简单。嗯,现在有 3 个同时正确的答案,谁会得到绿色的勾号?

标签: python string-formatting


【解决方案1】:

您可以在大小要求前加上 - 以左对齐:

sys.stdout.write("%-6s %-50s %-25s\n" % (code, name, industry))

【讨论】:

  • 不错的解决方案。这是最好的解决方案。
  • 如果我的尺寸/宽度值是可变的怎么办?
  • @ViFI 你可以像这样使用 * 符号 '%-*sText'%(3,'A')
【解决方案2】:

此版本使用str.format 方法。

Python 2.7 及更新版本

sys.stdout.write("{:<7}{:<51}{:<25}\n".format(code, name, industry))

Python 2.6 版本

sys.stdout.write("{0:<7}{1:<51}{2:<25}\n".format(code, name, industry))

更新

以前在文档中有一个关于 % 运算符将来会从语言中删除的声明。此声明为removed from the docs

【讨论】:

  • 旧样式不再被弃用,我相信:bugs.python.org/issue14123
  • 看起来这个问题被拒绝了。阶段:提交/拒绝
  • 该状态用于表示“已提交”,这肯定是因为对文档进行了更改。 3.2 文档中的“旧字符串格式化操作”现在是 3.3 中的 printf-style String Formattingpossible 弃用警告 - 它实际上说“可能 消失”,它从来都不是确定的 - 现在该部分也没有,取而代之的是关于它的警告“古怪”。它不会消失。
  • 您正在查看文档的不同部分。 Old string formatting 部分仍然存在于 3.3 文档中,它位于教程部分而不是库参考之下。并且“这种旧式格式最终将从语言中删除”的声明仍然存在。
  • @Matthew - 虚假信息是旨在误导的虚假信息。我怀疑 Marwan 有任何这样的意图。
【解决方案3】:
sys.stdout.write("%-6s %-50s %-25s\n" % (code, name, industry))

在旁注中,您可以使用 *-s 使宽度可变

>>> d = "%-*s%-*s"%(25,"apple",30,"something")
>>> d
'apple                    something                     '

【讨论】:

    【解决方案4】:

    我绝对更喜欢format 方法,因为它非常灵活,可以通过定义__format__strrepr 表示形式轻松扩展到您的自定义类。为了简单起见,我在以下示例中使用print,可以将其替换为sys.stdout.write

    简单示例:对齐/填充

    #Justify / ALign (left, mid, right)
    print("{0:<10}".format("Guido"))    # 'Guido     '
    print("{0:>10}".format("Guido"))    # '     Guido'
    print("{0:^10}".format("Guido"))    # '  Guido   '
    

    我们可以在align 指定的^&lt;&gt; 旁边添加一个填充字符,以将空格替换为任何其他字符

    print("{0:.^10}".format("Guido"))    #..Guido...
    

    多输入示例:对齐并填充多个输入

    print("{0:.<20} {1:.>20} {2:.^20} ".format("Product", "Price", "Sum"))
    #'Product............. ...............Price ........Sum.........'
    

    高级示例

    如果您有自定义类,则可以将其定义为 strrepr 表示形式,如下所示:

    class foo(object):
        def __str__(self):
            return "...::4::.."
    
        def __repr__(self):
            return "...::12::.."
    

    现在您可以使用!s (str) 或!r (repr) 来告诉python 调用那些定义的方法。如果没有定义,Python 默认为__format__,它也可以被覆盖。 x = foo()

    print "{0!r:<10}".format(x)    #'...::12::..'
    print "{0!s:<10}".format(x)    #'...::4::..'
    

    来源:Python Essential Reference,David M. Beazley,第 4 版

    【讨论】:

      【解决方案5】:

      使用 Python 3.6 中新的和流行的 f-strings,下面是我们如何左对齐一个具有 16 个填充长度的字符串:

      string = "Stack Overflow"
      print(f"{string:<16}..")
      Stack Overflow  ..
      

      如果你有可变的填充长度:

      k = 20
      print(f"{string:<{k}}..")
      Stack Overflow      .. 
      

      f-strings 更紧凑。

      【讨论】:

      • str 是 Python 内置的,因此使用它作为对象名称并不理想。
      • 也可以将方向字符&gt;&lt;^等作为变量,所以a="&lt;"之后可以使用:f"{string:{a}{k}"
      • 为@user1767754 显示的内容添加选项会很有帮助:插入填充字符,例如by f"{string:_&lt;16}"(本例中的填充字符是'_')。
      【解决方案6】:

      使用-50% 而不是+50% 它们将左对齐..

      【讨论】:

      • ex: print "%-30s" % (name) 以左缩进打印名称。
      【解决方案7】:

      一个更易读的替代解决方案:
      sys.stdout.write(code.ljust(5) + name.ljust(20) + industry)

      请注意,ljust(#ofchars) 使用固定宽度的字符,不会像其他解决方案那样动态调整。

      (另请注意,在现代 Python 中使用+ 进行字符串添加的速度明显快于过去,但如果您仍然习惯于使用这种方法,您可以将+ 换成''.join(...)

      【讨论】:

        【解决方案8】:

        这个在我的 python 脚本中工作:

        print "\t%-5s %-10s %-10s %-10s %-10s %-10s %-20s"  % (thread[0],thread[1],thread[2],thread[3],thread[4],thread[5],thread[6])
        

        【讨论】:

        • 不确定这在区别于其他任何东西方面增加了什么。线程数组到底是什么?
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-07-20
        • 2018-05-31
        • 2011-03-08
        • 1970-01-01
        • 1970-01-01
        • 2017-05-26
        • 2012-01-17
        相关资源
        最近更新 更多