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
相关产品推荐
相关产品推荐

