Python科目管理程序file not found报错排查及功能实现求助
代码错误原因修正
以下是触发file not found报错以及其他运行错误的核心问题:
read_subjects函数的参数为file_name,但函数内部打开文件时错误使用了未定义的subjects变量,无法识别正确的目标文件名- 主函数调用
read_subjects时错误传入了未定义的subject变量,而非用户输入的文件名变量file_name - 搜索逻辑中出现了未定义的
hobby变量,会触发运行时报错 - 代码中所有转义字符
"需要替换为正常双引号,否则会触发语法错误 - 原文件操作没有使用安全的上下文管理器,异常场景下可能出现文件句柄未正常关闭的问题
修正后的完整代码
# 显示菜单并获取用户选择 def menu(): print('输入"1"打印科目列表') print('输入"2"搜索指定科目') print('输入"3"添加新科目') print('输入"q"退出程序') option = input('请输入选项: ') return option.lower() # 读取科目文件 def read_subjects(file_name): with open(file_name, 'r', encoding='utf-8') as f: return f.readlines() # 写入新科目到文件 def write_to_file(file_name, subject): current_lines = [] try: current_lines = read_subjects(file_name) except: pass current_lines.append(subject + '\n') with open(file_name, 'w', encoding='utf-8') as f: f.writelines(current_lines) # 主函数 def main(): correct_file_name = False subjects = [] # 循环校验文件名合法性 while not correct_file_name: file_name = input('请输入要读取的文件名: ') try: subjects = read_subjects(file_name) correct_file_name = True except FileNotFoundError: print('错误:未找到指定文件,请重新输入') except Exception as e: print(f'文件读取错误:{e},请重新输入') # 主逻辑循环 while True: selected_option = menu() # 退出程序 if selected_option == 'q': print('程序已退出') break # 打印所有科目 if selected_option == '1': print('===== 科目列表 =====') count = 0 for line in subjects: count += 1 print(f"{count}: {line.strip()}") print(f'科目总数: {count}') print('====================\n') # 搜索科目 if selected_option == '2': search_key = input('请输入要搜索的科目关键词: ') print('===== 搜索结果 =====') count = 0 for line in subjects: striped_line = line.strip() if search_key.lower() in striped_line.lower(): count += 1 print(f"{count}: {striped_line}") print(f'匹配到的科目总数: {count}') print('====================\n') # 添加新科目 if selected_option == '3': new_subject = input('请输入要添加的新科目名称: ') write_to_file(file_name, new_subject) # 同步更新内存中的科目列表 subjects = read_subjects(file_name) print(f'科目"{new_subject}"已添加成功\n') if __name__ == '__main__': main()
测试用subjects.txt示例(放在和代码同一目录下)
语文
数学
英语
物理
化学
生物
政治
历史
地理
信息技术
体育
美术
运行示例
请输入要读取的文件名: subjects.txt 输入"1"打印科目列表 输入"2"搜索指定科目 输入"3"添加新科目 输入"q"退出程序 请输入选项: 1 ===== 科目列表 ===== 1: 语文 2: 数学 3: 英语 4: 物理 5: 化学 6: 生物 7: 政治 8: 历史 9: 地理 10: 信息技术 11: 体育 12: 美术 科目总数: 12 ==================== 输入"1"打印科目列表 输入"2"搜索指定科目 输入"3"添加新科目 输入"q"退出程序 请输入选项: 2 请输入要搜索的科目关键词: 理 ===== 搜索结果 ===== 1: 物理 2: 地理 匹配到的科目总数: 2 ==================== 输入"1"打印科目列表 输入"2"搜索指定科目 输入"3"添加新科目 输入"q"退出程序 请输入选项: 3 请输入要添加的新科目名称: 音乐 科目"音乐"已添加成功 输入"1"打印科目列表 输入"2"搜索指定科目 输入"3"添加新科目 输入"q"退出程序 请输入选项: q 程序已退出
内容的提问来源于stack exchange,提问作者TTX
相关产品推荐
相关产品推荐

