【问题标题】:Printing with indentation in python在 python 中使用缩进打印
【发布时间】:2013-09-16 09:10:09
【问题描述】:

有没有办法打印以下内容,

print user + ":\t\t" + message

所以比终端长度更宽的冗长消息总是换行(从同一位置开始)? 比如这个

Username:              LEFTLEFTLEFTLEFTLEFTLEFTLEFT
RIGHTRIGHTRIGHT

应该变成

Username:              LEFTLEFTLEFTLEFTLEFTLEFTLEFT
                       RIGHTRIGHTRIGHT

【问题讨论】:

  • 您可能想要使用更长的示例,因为这个示例实际上不会包含在典型的 80 列终端上……

标签: python word-wrap


【解决方案1】:

我认为您在这里寻找的是textwrap 模块:

user = "Username"
prefix = user + ": "
preferredWidth = 70
wrapper = textwrap.TextWrapper(initial_indent=prefix, width=preferredWidth,
                               subsequent_indent=' '*len(prefix))
message = "LEFTLEFTLEFTLEFTLEFTLEFTLEFT RIGHTRIGHTRIGHT " * 3
print wrapper.fill(message)

打印出来:

Username: LEFTLEFTLEFTLEFTLEFTLEFTLEFT RIGHTRIGHTRIGHT
          LEFTLEFTLEFTLEFTLEFTLEFTLEFT RIGHTRIGHTRIGHT
          LEFTLEFTLEFTLEFTLEFTLEFTLEFT RIGHTRIGHTRIGHT

如果您真的想在缩进中使用制表符,那就有点棘手了,因为您必须先制表符扩展 initial_indent 才能找出要使用的正确 subsequent_indent。而且,因为您的前缀实际上以两个制表符结束,所以它更加复杂。这是我想出的最简单的:

user = "Username"
prefix = user + ":\t\t"
expanded_indent = textwrap.fill(prefix+'$', replace_whitespace=False)[:-1]
subsequent_indent = ' ' * len(expanded_indent)
wrapper = textwrap.TextWrapper(initial_indent=prefix,
                               subsequent_indent=subsequent_indent)
message = "LEFTLEFTLEFTLEFTLEFTLEFTLEFT RIGHTRIGHTRIGHT " * 3
print wrapper.fill(message)

如果您重复执行此操作,您可能希望将这些混乱包装在一个函数中。

【讨论】:

  • 当他的控制台不是宽度为 70 时?
  • 我从来不知道 Textwrap 库。太棒了!
  • @Hyperboreus OP 可以选择他们想要换行的宽度,并将width 参数指定给textwrap.TextWrapper
  • 好的,那么当我想适应我的实际终端宽度时该怎么办?
  • @Hyperboreus:您需要获取实际的终端宽度,可能减去 1,然后将其作为宽度传递。并且您最好为 stdout 不是终端的情况编写后备代码(例如,它被重定向到文本文件,或通过管道传输到可能输出到控制台或不输出到控制台的其他程序,或作为 WSGI 运行...),或者您无法获得宽度。对此没有万能的解决方案。您必须编写适合您的用例的内容。
【解决方案2】:

在 Python 2 中,我建议使用 format 向左缩进,例如:

print '{:<30}{:<40}'.format('UserName:','Foo')
print '{:<30}{:<40}'.format('User:','FooBar')
print '{:<30}{:<40}'.format('','FooBar42')

将导致:

UserName:                     Foo                                     
User:                         FooBar                                  
                              FooBar42     

等等……

对于 Python 3, 使用括号 :) 此外,同样可以使用f-strings 写得更紧凑:

print (f"{'UserName:':<30}{'Foo':<40}")
print (f"{'User:':<30}{'FooBar':<40}")
print (f"{'':<30}{'FooBar42':<40}")

也会导致:

UserName:                     Foo                                     
User:                         FooBar                                  
                              FooBar42     

【讨论】:

    【解决方案3】:

    您可以使用str.ljust() 将每一行填充到所需的宽度,如下所示:

    line_width = 20
    print "Username:".ljust(line_width) + "LEFT"*6
    print "".ljust(line_width) + "RIGHT"*3
    

    您传递给ljust 的参数是您希望字符串的长度,只要这是一致的,行应该正确排列。

    或者,您可以在只需要填充的行上使用字符串乘法,如下所示:

    print " "*line_width + "RIGHT"*3
    

    这将与上面代码中的最后一行具有完全相同的输出。

    【讨论】:

    • 非常感谢,但不是我想要的。 LEFTLEFTRIGHT 是消息变量中的内容,它一直在变化,所以我不知道它有多长。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-07
    • 2012-10-04
    • 2013-07-31
    • 2020-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多