Python 输出的高级格式化

Advanced Output Formatting in Python

Posted by J Leaves on April 3, 2020

Python 中的动态输出

动态输出,即随着程序的运行不断更新输出的内容,常见的应用场景为提示正在加载、显示任务进度等。那么如何在 Python 中动态输出呢?

1. 简单的 Loading 条

只需要在 print 中加上 end 参数,即可以假乱真

1
2
3
4
5
import time
print("Loading",  end="")
for i in range(6):
    print(".", end="")
    time.sleep(0.5)

1

2. 使用 stdout 实现复杂的动态输出

Ref: Stackoverflow and this post

\r 是回车符,将光标移至行首;flush 函数清空输出缓存中的该行

1
2
3
4
5
6
7
from sys import stdout
from time import sleep
for i in range(6):
    stdout.write("\r%d" % i)
    stdout.flush()
    sleep(0.5)
stdout.write("\n")

2

3. 使用 ANSI 转义序列 \r\x1b[K 实现复杂的动态输出

若不使用 stdout 库,则需要使用 控制字符 (Control Sequence)来控制输出。

\r 是回车符,将光标移至行首。

\x1b[K 是 ANSI 转义序列。其中 \x1b (或者 \33)在 Python 中代表 ESC,\x1b[ 即 ESC [控制序列导入器 (CSI, Control Sequence Introducer) 标志着控制字符的开始 ,K 是 CSI 序列用于清空该行,\x1b[K 即 ESC [ K

总之,记住 \r\x1b[K 这一奇妙的字符串。

1
2
3
4
5
from time import sleep
for i in range(6):
    print("\r\x1b[K%d" % i, end="")
    sleep(0.5)
print(end="\n")

3

Python 输出粗体下划线颜色

\33 也可用 \x1b 代替

  开始 结束
粗体 \33[1m \33[0m
斜体# \33[3m  
下划线 \33[4m  
已选中 \33[7m  
黑色 \33[30m  
红色 \33[31m  
绿色 \33[32m  
黄色 \33[33m  
蓝色 \33[34m  
紫色 \33[35m  
蓝绿色 \33[36m  
灰色 \33[37m  

#:经测试,Jupyter Notebook 不支持输出斜体

1
print("\33[1mBold\33[0m\33[4mUnderline\33[0m\33[1m\33[4mBoldAndUnderline\33[0mNormal")

4