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

Python如何在用户输入不在指定列表时抛出异常并解决死循环问题

问题原因

当前代码死循环+逻辑错乱的核心问题有三个:

  • 扩展名校验的while循环没有更新判断变量:循环里虽然让用户重新输入扩展名,但只做了打印操作,没有把新输入的值赋值给存储扩展名的变量i,只要第一次输入非法,i的值永远不变,循环判断条件永远成立,直接卡死。
  • 代码嵌套顺序错误:目录遍历的逻辑被写在了扩展名校验的while循环内部,意味着只要扩展名不合法,还没等拿到合法输入就会反复弹出目录输入提示,流程完全混乱。
  • 模块逻辑脱节:文件读取的while True逻辑写在了main()函数外部,和前面的扩展名校验、文件遍历逻辑完全独立,哪怕前面检索完成也无法和读取逻辑联动。
修正后代码
import os

# 预设合法扩展名列表,可根据实际需求调整
document_extensions = ['.txt', '.md', '.py', '.docx', '.csv']

def main():
    # 循环校验扩展名,直到输入合法才进入下一步
    target_ext = input("Enter a File Extension You Wish To seek!").strip()
    while target_ext not in document_extensions:
        target_ext = input("Enter a Valid Extension:").strip()

    # 获取待检索目录,遍历匹配文件
    search_path = input("Enter a Directory:").strip()
    print(f"\nAll matched files with {target_ext} extension:")
    for root, dirs, files in os.walk(search_path, topdown=True, onerror=None, followlinks=True):
        for name in files:
            if name.endswith(target_ext):
                print(os.path.join(root, name))

    # 循环校验文件路径,读取合法文件内容
    while True:
        try:
            target_file = input("\nEnter Path To File You Wish To View!").strip()
            with open(target_file, "r", encoding="utf-8") as f:
                print(f.read())
            break
        except FileNotFoundError:
            print("Enter a Valid Path!")
        except UnicodeDecodeError:
            print("This file is not a readable text file, please enter a valid path.")

if __name__ == "__main__":
    main()
关键调整说明
  • 补全了校验循环的变量更新逻辑:每次用户输入新的扩展名后,都会重新赋值给target_ext变量,一旦输入命中合法列表就立刻退出循环,从根源解决死循环问题。
  • 重新梳理了代码执行顺序:严格按照「校验合法扩展名→输入检索目录→遍历输出匹配文件→校验文件路径→读取文件内容」的线性流程执行,不会出现嵌套逻辑导致的反复弹窗问题。
  • 用with上下文管理器替代手动打开/关闭文件,避免文件资源泄漏,同时新增了非文本文件的解码错误捕获,遇到二进制文件不会直接崩溃。
  • 给所有用户输入加了首尾空格自动过滤,避免用户误输入空格导致的校验失败。

内容的提问来源于stack exchange,提问作者FlatwhiteRuby

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 16:48:17