使用Python进行缩进打印

40
有没有一种方法可以打印以下内容:
print user + ":\t\t" + message

如何让超出终端长度的长信息自动折行(从同一位置开始)?例如:

Username:              LEFTLEFTLEFTLEFTLEFTLEFTLEFT
RIGHTRIGHTRIGHT

应该变成

Username:              LEFTLEFTLEFTLEFTLEFTLEFTLEFT
                       RIGHTRIGHTRIGHT

1
你可能想使用一个更长的例子,因为这个例子在典型的80列终端上实际上不会换行... - abarnert
4个回答

41

我认为您在这里需要的是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时呢? - Hyperboreus
3
我之前不知道 Textwrap 库。太棒了! - user764357
1
@Hyperboreus OP可以选择他们想要换行的宽度,并将“width”参数指定为“textwrap.TextWrapper”。 - user764357
1
好的,那么当我想要适应我的实际终端宽度时,我该怎么做? - Hyperboreus
1
@Hyperboreus:你需要获取实际终端宽度,可能要减去 1,并将其作为宽度传递。最好为标准输出不是终端的情况编写备用代码(例如,它被重定向到文本文件,或者被管道传输到其他可能输出到控制台或作为 WSGI 运行的程序中),或者你无法获取宽度的情况。没有通用解决方案;你必须根据你的用例编写适当的代码。 - abarnert
显示剩余3条评论

22

在 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     

11
你可以使用 str.ljust() 函数来使每行文本填充到所需的宽度,像这样:
line_width = 20
print "Username:".ljust(line_width) + "LEFT"*6
print "".ljust(line_width) + "RIGHT"*3

你向 ljust 传递的参数是你希望字符串的长度,只要保持一致,行就应该正确对齐。

或者,您可以在仅需要填充的行上使用字符串乘法:

print " "*line_width + "RIGHT"*3

这将产生与上述代码中最后一行完全相同的输出。


1
非常感谢,但不是我要找的东西。LEFTLEFTRIGHT的内容在消息变量中,它总是在变化,所以我不知道有多长。 - Algorithmatic

1
你也可以使用以下格式: 假设你有数据框df,想要缩进打印所有内容。
print("\t"+df.to_string().replace("\n","\n\t"))

应该像魔法一样运行


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