Python3如何删除标准输出中的单个字符
回答
直接用ANSI终端控制序列就行,不需要装任何第三方模块,现在主流的Windows Terminal、macOS自带终端、Linux各发行版默认终端全支持,比堆换行或者整屏清屏的方案灵活多了。
无依赖原生写法(最推荐)
分两种常见场景,按需选就行:
- 如果你能调整原来的打印逻辑
别让print默认在末尾加换行,打完内容之后用退格符把光标移到要删的字符位置,覆盖掉不需要的字符再补换行就完事了,对应你举的例子代码如下:
运行后输出就是你要的# 先打印目标内容,end='' 表示不在末尾自动追加换行 print("Hello, World!", end='') # \b 是把光标左移1位,打空格覆盖掉末尾的!,再退一次格避免留下多余空格 print('\b \b', end='') # 最后补个换行,后续打印内容会正常从下一行开始 print()Hello, World,没有多余空行,也不会出现闪屏问题。 - 如果你已经执行完原有打印代码,光标已经跑到下一行开头了
这时候用光标移动序列跳回去覆盖即可,比如你已经跑完了原来的print("Hello, World!"),直接接下面这行代码就能把上一行末尾的!删掉:
这个属于局部内容覆盖,符合清屏类实现的要求,比整屏清空的使用体验好很多。# \033[A 是光标上移1行,\r 是回到当前行开头,直接打印正确内容覆盖整行旧内容 print('\033[A\rHello, World')
要是你在用Win7及以前老版本系统自带的CMD,默认没开ANSI序列支持,不用装第三方包,用系统自带的ctypes开一下终端模式就行,代码如下:
import ctypes handle = ctypes.windll.kernel32.GetStdHandle(-11) ctypes.windll.kernel32.SetConsoleMode(handle, 7) # 这行执行完之后,上面的ANSI控制代码就能正常生效
模块实现方案(非必要不推荐)
如果要做复杂的终端交互,不想自己记控制序列,也可以用模块实现:
- 标准库自带的
curses模块(Windows下需要额外装windows-curses包)可以精准控制光标位置、增删终端字符,适合写终端UI类程序,单纯用来删单个字符属于大材小用。 - 第三方库
rich也封装了终端操作的相关接口,不过为了删单个字符特意装第三方库性价比很低。
别用那种打印几十上百个换行把旧内容顶出屏幕的方案,效果差还会把终端滚动条搞的很乱,上面的覆盖方案不管是性能还是视觉效果都好得多。
内容的提问来源于stack exchange,提问作者NumberBasher
相关产品推荐
相关产品推荐

