Python书籍阅读器循环实现:解决FileNotFoundError及输入校验问题
解决书籍阅读器的文件错误与逻辑问题
问题根源
- 输入无校验:直接用用户输入拼接文件名,既没检查输入是否为有效数字,也没验证是否在1-10范围内,非法输入直接触发文件找不到错误。
- 循环条件错误:
option是字符串类型,和整数0比较永远为真,输入0无法退出程序。 - 异常处理缺失:没捕获文件打开时的
FileNotFoundError,且原代码的else块绑定的是for循环(仅循环正常结束时执行),不是文件不存在的错误处理逻辑。 - 文件操作不规范:重复打开文件且未手动关闭,存在资源泄漏风险。
修复后的代码
import time while True: user_input = input('Which Book would you like to read? (1-10, input 0 to exit): ') # 校验输入是否为有效数字 if not user_input.isdigit(): print("Error: Please enter a valid number between 0 and 10.") print() continue option = int(user_input) # 处理退出逻辑 if option == 0: print("Goodbye") break # 校验数字范围 if not (1 <= option <= 10): print("Error: Number must be between 1 and 10.") print() continue file_name = f"{option}.txt" try: # 统计单词数 with open(file_name, encoding='utf-8') as f: file_contents = f.read() number_of_words = len(file_contents.split()) print('Word Count:', number_of_words) time.sleep(2) # 逐行打印内容 with open(file_name, encoding='utf-8') as f: for line in f: print(line, end='') # 避免重复换行 time.sleep(0.1) # 可选延迟,提升阅读体验 except FileNotFoundError: print(f"404 file not found: {file_name}") print()
关键改进点
- 分层输入验证:先检查输入是否为数字,再判断范围,提前拦截非法输入,避免无效文件操作。
- 优化循环逻辑:用
while True配合break实现清晰的退出控制,解决类型匹配错误问题。 - 异常捕获机制:通过
try-except捕获FileNotFoundError,即使输入在1-10范围内但文件不存在,也能友好提示。 - 规范文件操作:使用
with语句自动管理文件资源,无需手动关闭,更安全简洁。 - 阅读体验优化:调整打印逻辑避免重复换行,可选增加小延迟让内容逐行显示更自然。
内容的提问来源于stack exchange,提问作者Sinister Pear
相关产品推荐
相关产品推荐

