Python print()多行覆盖问题:如何实现循环指定格式输出?
解决Python多行控制台输出覆盖问题
问题描述
编写了一段Python代码,希望循环输出两行内容,每次循环覆盖上一次的两行输出,但实际运行时内容不断追加新行,无法回到上一行覆盖原有内容,尝试设置print的end参数为''或'\r'仍未解决。
原代码
import time start_time = time.time() while (time.time() - start_time) < 10: current_date_time = time.strftime("%Y-%m-%d %H:%M:%S") current_time = time.strftime("%H:%M:%S") print("\r" + current_date_time) print(current_time, end="\r") time.sleep(0.5)
预期输出
期望实现循环更新的两行输出,格式如下:
cycle1: line1: data1 line2: data2 cycle2: line1: data3 line2: data4 ... cycleN: line1: dataN line2: dataN+1
实际输出
实际运行时内容持续追加新行,无法覆盖:
2023-05-12 14:25:24 (data1) 2023-05-12 14:25:25 (data3) 2023-05-12 14:25:25 (data5) 2023-05-12 14:25:26 (data6) 14:25:26 (data7)
解决方案
使用ANSI转义序列控制光标位置和清除行内容,结合colorama处理跨平台终端兼容性,修改后的代码如下:
import datetime import time import colorama from colorama import Fore, Style def main(): # 初始化colorama,适配Windows终端的ANSI序列支持 colorama.init() start_time = time.time() cycle_length = 10 # 首次打印前先输出空行,避免光标位置异常 print("\n") while (time.time() - start_time) < cycle_length: now = datetime.datetime.now() date_time_str = now.strftime("%Y-%m-%d %H:%M:%S") time_str = now.strftime("%H:%M:%S") # 清除当前两行内容并将光标移回初始位置 print("\033[2K", end="") # 清除当前行 print("\033[F", end="") # 光标上移一行 print("\033[2K", end="") # 清除上一行 print("\033[F", end="") # 光标再上移一行(回到初始位置) # 打印新的两行内容 print(Fore.GREEN + date_time_str) print(Fore.YELLOW + time_str) time.sleep(0.5) # 退出循环后清理终端残留内容 print("\033[2K", end="") print("\033[F", end="") print("\033[2K", end="") colorama.deinit() if __name__ == "__main__": main()
核心要点
\033[2K:清除当前行的全部内容,避免残留旧文本\033[F:将光标移动到上一行的起始位置,实现回退覆盖colorama:解决Windows系统终端不支持ANSI转义序列的问题,保证代码在Windows、Linux、MacOS上都能正常运行- 循环开始前先输出两行空行,确保光标位置初始状态稳定,避免首次清理时出现异常
内容的提问来源于stack exchange,提问作者Olga
相关产品推荐
相关产品推荐

