如何在 python 中正确格式化控制台输出?

How would I format console output in python correctly?

提问人:Storm 提问时间:11/6/2023 更新时间:11/6/2023 访问量:50

问:

from colorama import Fore
import platform
import distro
import time
import os

# Functions
def get_uptime():
    return os.popen('uptime -p').read()[:-1]

def get_os():
    return platform.system() + " " + platform.release()

# Main Entry
def main():
    linux_distro = distro.name()
    os_string = f"OS: {get_os()}"
    uptime_str = f"Uptime: {get_uptime()}"
    if 'pop' in linux_distro.lower():
        print(Fore.CYAN + f"""


            ←←←←←←←←←←←              ╠═══════════════ ROGUE FETCH ═════════════════════════════╣
        ←←←←←←←←←←←←←←←←←←←          ╠  {os_string}                                            ╣
      ←←←←←←    ←←←←←←←←←←←←←        ╠                                                         ╣
    ←←←←←         ↖←←←←←←←←←←←←      ╠  {uptime_str}                                           ╣
   ←←←←     ←←      ←←←←←←←←←←←←     ╠                                                         ╣
 ↖←←←←←     ←←←     ←←←←←←←←←←←←←↖   ╠                                                         ╣
 ←←←←←←←     ←←←    ←←←    ↖←←←←←←   ╠                                                         ╣
←←←←←←←←←     ←↖   ↖←←↖    ←←←←←←←←  ╠═════════════════════════════════════════════════════════╣
←←←←←←←←←←        ←←←←    ↖←←←←←←←←
←←←←←←←←←←←    ↖←←←←←←   ↖←←←←←←←←←
←←←←←←←←←←←←    ←←←←←←  ←←←←←←←←←←←
←←←←←←←←←←←←←    ←←←←←↖←←←←←←←←←←←←
 ←←←←←←←←←←←←←   ↖←←←↖ ←←←←←←←←←←← 
 ↖←←←←←←←←←←←←←  ←←←←  ←←←←←←←←←←↖ 
   ←←←←←←←←←←←←←←←←←←←←←←←←←←←←←   
    ←←←←                   ←←←←    
      ←←←←←←←←←←←←←←←←←←←←←←←      
        ←←←←←←←←←←←←←←←←←←←        
            ←←←←←←←←←←←            
  
        """)

我用符号制作了框架,但是在运行时,它看起来没有对齐并且看起来不对齐: 友情链接: https://media.discordapp.net/attachments/1164305090144915556/1170754515495030895/image.png?ex=655a311c&is=6547bc1c&hm=41877fdc735ae2b06a1c7588f7c7ba397c2dd69cf8229d2ef6df6348379263f9&=&width=1160&height=487

Python 终端 控制台 对齐 ASCII

评论


答:

0赞 Markus Hirsimäki 11/6/2023 #1

您已根据“{uptime_str}”长度(而不是所包含字符串的实际长度)对齐文本。源代码中的对齐方式与视觉输出不匹配。

使用,然后使用一些填充机制,例如:len(uptime_str)

"mystring".rjust(how_much_to_pad)

"mystring".ljust(how_much_to_pad)

" " * len(uptime_str)

同样的问题也适用于你的os_string

评论

0赞 Storm 11/6/2023
已经试过了,没有用
0赞 Markus Hirsimäki 11/6/2023
请详细说明
0赞 Storm 11/6/2023
我试过使用 ljust,但是即使在之后,对齐仍然一团糟
0赞 quamrana 11/6/2023
请用这两行的示例来更新您的问题,您希望如何查看它们。
0赞 Storm 11/6/2023
像其他的一样,正确对齐到侧面
0赞 LhasaDad 11/6/2023 #2

您可以在 f 字符串变量定义中设置字符串的格式。例如,所有这些打印的每侧都有一个条形图,它们之间有一个 25 个字符的字段。弄清楚你正在使用的 var 字符串需要多宽,并把它放得那么大,并根据需要添加剩余的空间。

print(f"|{variable:25}|")    # default formating, string left justified, numeric right
print(f"|{variable:>25}|")   # right justifed
print(f"|{variable:<25}|")   # left justifed
print(f"|{variable:^25}|")   # center justified

我重新编写了您的代码,以便它可以在本地工作,让您了解我的意思:

import platform
import os

# Functions

def get_os():
    return platform.system() + " " + platform.release()

# Main Entry
def main():
    os_string = f"OS: {get_os()}"
    print( f"""


            ←←←←←←←←←←←              ╠═══════════════ ROGUE FETCH ═════════════════════════════╣
        ←←←←←←←←←←←←←←←←←←←          ╠  {os_string:<25}                              ╣
      ←←←←←←    ←←←←←←←←←←←←←        ╠                                                         ╣
    ←←←←←         ↖←←←←←←←←←←←←      ╠                                                         ╣
   ←←←←     ←←      ←←←←←←←←←←←←     ╠                                                         ╣
 ↖←←←←←     ←←←     ←←←←←←←←←←←←←↖   ╠                                                         ╣
 ←←←←←←←     ←←←    ←←←    ↖←←←←←←   ╠                                                         ╣
←←←←←←←←←     ←↖   ↖←←↖    ←←←←←←←←  ╠═════════════════════════════════════════════════════════╣
←←←←←←←←←←        ←←←←    ↖←←←←←←←←
←←←←←←←←←←←    ↖←←←←←←   ↖←←←←←←←←←
←←←←←←←←←←←←    ←←←←←←  ←←←←←←←←←←←
←←←←←←←←←←←←←    ←←←←←↖←←←←←←←←←←←←
 ←←←←←←←←←←←←←   ↖←←←↖ ←←←←←←←←←←← 
 ↖←←←←←←←←←←←←←  ←←←←  ←←←←←←←←←←↖ 
   ←←←←←←←←←←←←←←←←←←←←←←←←←←←←←   
    ←←←←                   ←←←←    
      ←←←←←←←←←←←←←←←←←←←←←←←      
        ←←←←←←←←←←←←←←←←←←←        
            ←←←←←←←←←←←            
  
        """)
    

main()

我收到了以下内容作为输出:

            ←←←←←←←←←←←              ╠═══════════════ ROGUE FETCH ═════════════════════════════╣
        ←←←←←←←←←←←←←←←←←←←          ╠  OS: Windows 11                                         ╣
      ←←←←←←    ←←←←←←←←←←←←←        ╠                                                         ╣
    ←←←←←         ↖←←←←←←←←←←←←      ╠                                                         ╣
   ←←←←     ←←      ←←←←←←←←←←←←     ╠                                                         ╣
 ↖←←←←←     ←←←     ←←←←←←←←←←←←←↖   ╠                                                         ╣
 ←←←←←←←     ←←←    ←←←    ↖←←←←←←   ╠                                                         ╣
←←←←←←←←←     ←↖   ↖←←↖    ←←←←←←←←  ╠═════════════════════════════════════════════════════════╣
←←←←←←←←←←        ←←←←    ↖←←←←←←←←
←←←←←←←←←←←    ↖←←←←←←   ↖←←←←←←←←←
←←←←←←←←←←←←    ←←←←←←  ←←←←←←←←←←←
←←←←←←←←←←←←←    ←←←←←↖←←←←←←←←←←←←
 ←←←←←←←←←←←←←   ↖←←←↖ ←←←←←←←←←←←
 ↖←←←←←←←←←←←←←  ←←←←  ←←←←←←←←←←↖
   ←←←←←←←←←←←←←←←←←←←←←←←←←←←←←
    ←←←←                   ←←←←
      ←←←←←←←←←←←←←←←←←←←←←←←
        ←←←←←←←←←←←←←←←←←←←
            ←←←←←←←←←←←

评论

0赞 Storm 11/6/2023
问题是字符串并不总是相同的大小,例如,不同的系统会更短/更长,我需要自动对齐它们os_string
0赞 LhasaDad 11/6/2023
@storm我给你的东西会给你 25 个字符的空间来容纳它,如果你需要 50 个字符的空间,那么数字是 50。在您的情况下,使用变量的左对齐形式:{os_string:<25},在这种情况下,即使操作系统字符串为 10,它也将始终将其填充为 25 个字符。这应该可以让您正确完成输出格式化。uptime_str的类似处理
0赞 LhasaDad 11/6/2023
@Storm更进一步,如果你的框是 35 个字符宽,当你输入代码时,你的垂直条之间会有 10 个额外的空格来填充格式化的字符串,以保持条形与其他行对齐。
0赞 quamrana 11/6/2023 #3

您只需要指定最小和最大字段宽度即可。

我在这里选择了 50 个字符:

                    print(Fore.CYAN + f"""


            ←←←←←←←←←←←              ╠═══════════════ ROGUE FETCH ═════════════════════════════╣
        ←←←←←←←←←←←←←←←←←←←          ╠  {                                 os_string:50.50}     ╣
      ←←←←←←    ←←←←←←←←←←←←←        ╠                                                         ╣
    ←←←←←         ↖←←←←←←←←←←←←      ╠  {                                uptime_str:50.50}     ╣
   ←←←←     ←←      ←←←←←←←←←←←←     ╠                                                         ╣
 ↖←←←←←     ←←←     ←←←←←←←←←←←←←↖   ╠                                                         ╣
 ←←←←←←←     ←←←    ←←←    ↖←←←←←←   ╠                                                         ╣
←←←←←←←←←     ←↖   ↖←←↖    ←←←←←←←←  ╠═════════════════════════════════════════════════════════╣
←←←←←←←←←←        ←←←←    ↖←←←←←←←←
←←←←←←←←←←←    ↖←←←←←←   ↖←←←←←←←←←
←←←←←←←←←←←←    ←←←←←←  ←←←←←←←←←←←
←←←←←←←←←←←←←    ←←←←←↖←←←←←←←←←←←←
 ←←←←←←←←←←←←←   ↖←←←↖ ←←←←←←←←←←← 
 ↖←←←←←←←←←←←←←  ←←←←  ←←←←←←←←←←↖ 
   ←←←←←←←←←←←←←←←←←←←←←←←←←←←←←   
    ←←←←                   ←←←←    
      ←←←←←←←←←←←←←←←←←←←←←←←      
        ←←←←←←←←←←←←←←←←←←←        
            ←←←←←←←←←←←            
  
        """)