You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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')

问题根源

  1. 变量覆盖:循环内用index = 0覆盖了enumerate返回的索引变量,导致逻辑混乱
  2. 输出逻辑错误:单个字符打印+\r会让后续字符直接覆盖之前的内容,无法保留已破解的前缀
  3. 未处理非字母字符:输入包含空格、符号时,程序会陷入死循环
  4. 最终输出未锁定:匹配完成后用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 00:17:17