如何用Python清除Windows控制台当前行?附相关对比示例
解决Windows控制台用Python清除当前行的问题
我完全懂你遇到的这个困扰——Linux下用ANSI控制序列清行很顺手,但Windows控制台根本不认那套,凑空格的方法又容易因为数字长度变了掉链子,还不想加额外依赖包对吧?这里有两个靠谱的纯标准库方案:
方法一:调用Windows原生API(精准控制)
用Python标准库的ctypes直接调用Windows控制台API,能精准清除当前光标所在的行,不需要依赖任何第三方包:
import ctypes import time # 获取控制台句柄 kernel32 = ctypes.WinDLL('kernel32', use_last_error=True) hConsole = kernel32.GetStdHandle(-11) # -11 代表标准输出句柄 def clear_current_line(): # 获取当前光标位置 class COORD(ctypes.Structure): _fields_ = [("X", ctypes.c_short), ("Y", ctypes.c_short)] class CONSOLE_SCREEN_BUFFER_INFO(ctypes.Structure): _fields_ = [("dwSize", COORD), ("dwCursorPosition", COORD), ("wAttributes", ctypes.c_ushort), ("srWindow", ctypes.c_long * 4), ("dwMaximumWindowSize", COORD)] buffer_info = CONSOLE_SCREEN_BUFFER_INFO() kernel32.GetConsoleScreenBufferInfo(hConsole, ctypes.byref(buffer_info)) # 计算当前行的起始位置 line_start = COORD(0, buffer_info.dwCursorPosition.Y) # 获取控制台缓冲区的宽度 buffer_width = buffer_info.dwSize.X # 用空格填充当前行 chars_written = ctypes.c_ulong() kernel32.FillConsoleOutputCharacterW( hConsole, ' ', buffer_width, line_start, ctypes.byref(chars_written) ) # 把光标移回行首 kernel32.SetConsoleCursorPosition(hConsole, line_start) # 测试一下你的例子 for a in [8888888,77,3]: clear_current_line() print(a, end='\r') time.sleep(1) clear_current_line() # 最后清掉残留的数字
这个方法直接操作控制台缓冲区,不管当前行内容多长,都能彻底清空,而且光标会回到行首,完美解决空格不够的问题。
方法二:获取控制台宽度填充空格(更简洁)
如果觉得调用API太麻烦,还有个更简单的思路:先获取当前控制台的宽度,打印对应数量的空格覆盖整行,再把光标移回行首。Python 3.3+自带的os.get_terminal_size()可以直接获取控制台宽度:
import os import time def clear_current_line(): # 获取控制台的列数 terminal_width = os.get_terminal_size().columns # 打印足够的空格覆盖整行,然后回车到行首 print(' ' * terminal_width, end='\r') # 测试示例 for a in [8888888,77,3]: clear_current_line() print(a, end='\r') time.sleep(1) clear_current_line()
这个方法更简洁,虽然是用空格覆盖,但因为用了控制台的实际宽度,不管数字多长都能覆盖到,而且最后清行之后不会留任何残留。
两种方法都不需要额外安装依赖包,完全用Python标准库就能解决你的问题,你可以根据自己的需求选一个。
内容的提问来源于stack exchange,提问作者Kani
相关产品推荐
相关产品推荐

