Python控制台打印回退一行实现及暴力破解模拟程序输出异常求助
暴力破解模拟程序修复与控制台行回退技巧
问题描述
我写了个模仿电影中暴力破解效果的Python程序:请求用户输入文本后,控制台逐个打印小写字母,直到匹配文本中的对应字符,对所有字符重复这个流程。但程序输出不符合预期:
预期输出
Enter your text: def def
(注:中间会有逐个字符从a-z尝试的动画,最终锁定完整目标文本)
实际输出
Enter your text: def d e f
尝试在print语句中用end=''或end='\r'都未解决问题:
- 使用
end=''时输出:
Enter your text: def fa
- 使用
end='\r'时输出:
Enter your text: def f
同时想了解如何在控制台打印内容后回退一行。
原程序代码:
import time import os capital = ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"] lower = [element.lower() for element in capital] text = input("Enter your text: ") for index, char in enumerate(text): index = 0 while True: if str(char) == lower[index]: time.sleep(0.2) break elif str(char) != lower[index]: time.sleep(0.2) print(lower[index], end='\r') index += 1 print(char, end='\r')
问题根源
- 变量覆盖:循环内用
index = 0覆盖了enumerate返回的索引变量,导致逻辑混乱 - 输出逻辑错误:单个字符打印+
\r会让后续字符直接覆盖之前的内容,无法保留已破解的前缀 - 未处理非字母字符:输入包含空格、符号时,程序会陷入死循环
- 最终输出未锁定:匹配完成后用
end='\r'打印字符,后续操作会覆盖结果
修复后的代码
import time # 简洁生成小写字母列表 lower = [chr(ord('a') + i) for i in range(26)] text = input("Enter your text: ") # 存储已破解的字符前缀 cracked = [] for target_char in text: # 非小写字母直接加入结果 if target_char not in lower: cracked.append(target_char) print(''.join(cracked), end='\r') time.sleep(0.2) continue # 逐个尝试字母直到匹配 for try_char in lower: # 打印当前已破解前缀+尝试字符,光标回到行首实现覆盖动画 print(''.join(cracked) + try_char, end='\r') time.sleep(0.1) if try_char == target_char: break # 匹配成功,加入破解结果 cracked.append(target_char) # 最后打印完整结果,确保不会被覆盖 print(''.join(cracked))
关键改动说明
- 保留破解前缀:用
cracked列表存储已匹配的字符,每次打印完整前缀+当前尝试字符,配合\r实现电影式的逐位破解动画 - 兼容非字母字符:直接处理空格、符号等,避免死循环
- 优化字母生成:用
chr()+ord()替代手动列表,代码更简洁 - 锁定最终结果:循环结束后单独打印完整文本,防止被后续操作覆盖
控制台回退一行的方法
要实现控制台回退一行并可选清除内容,可使用ANSI转义序列:
- 仅回退一行:
print('\033[F', end='')—— 让光标上移一行 - 回退并清除当前行:
print('\033[F\033[K', end='')——\033[K用于清除光标所在行的全部内容
示例用法:
print("临时内容") time.sleep(1) # 回退并清除上一行 print('\033[F\033[K', end='') print("替换后的内容")
内容的提问来源于stack exchange,提问作者krnxmid
相关产品推荐
相关产品推荐

