Python如何根据用户选择的讲师索引匹配输出对应完整文本行
Python实现按讲师筛选课程行的指导
实现思路
- 优化原始数据存储逻辑:避免后续二次读取文件,遍历文件时除了存储讲师列表,同时存储所有完整的原始行数据
- 处理用户输入合法性校验:将用户输入的数字转换为整数,判断是否在可选的索引范围内,避免程序报错
- 匹配并输出结果:根据用户选择的索引拿到对应讲师名,筛选出所有该讲师对应的行输出
现有问题修正&代码实现
你原有代码存在笔误:拆分后的字段变量是f,但判断长度时写的是未定义的fields,需要先修正。
完整可运行代码示例(无第三方依赖)
# 提前读取文件所有行,避免后续二次读取,替换为你实际的文件路径 with open('course.txt', 'r', encoding='utf-8') as f: all_lines = [line.strip() for line in f if line.strip()] # 字段存储逻辑优化 subjects = [] lecturers = [] course_info = [] # 新增:存储每一行的(讲师名, 原始行)映射关系 for line in all_lines: fields = line.split(',') if len(fields) == 8: subjects.append(fields[0]) lect_name = fields[7].strip() lecturers.append(lect_name) course_info.append( (lect_name, line) ) # 讲师选择逻辑优化 def L(lecturer_list): print("\nLecturers\n---------") for ind, name in enumerate(lecturer_list, start=1): print(f"[{ind}] {name}") # 循环校验用户输入合法性 while True: pick = input("\npick a lecturer: ") # 判断输入是否为数字 if not pick.isdigit(): print("请输入有效的数字编号") continue pick_idx = int(pick) - 1 # 判断索引是否在合法范围 if 0 <= pick_idx < len(lecturer_list): target_lecturer = lecturer_list[pick_idx] break else: print(f"请输入1到{len(lecturer_list)}之间的数字") # 筛选所有对应讲师的行并输出 print(f"\n--- {target_lecturer} 的所有课程 ---") for lec, line in course_info: if lec == target_lecturer: print(line) # 交互选择逻辑 while True: filter_type = input("Choose filter. Or [Q]uit: ") if filter_type.upper() == 'Q': break elif filter_type.upper() == 'S': # 此处补充你原有按科目筛选的逻辑 break elif filter_type.upper() == 'L': L(lecturers) break
如果你确实需要每次筛选时重新读取文件(比如文件内容会实时更新),可以把筛选部分的逻辑替换为以下代码,不需要预存course_info:
print(f"\n--- {target_lecturer} 的所有课程 ---") # 替换为你实际的文件路径 with open('course.txt', 'r', encoding='utf-8') as f: for line in f: line = line.strip() if not line: continue fields = line.split(',') if len(fields) == 8 and fields[7].strip() == target_lecturer: print(line)
内容的提问来源于stack exchange,提问作者Dom Leigh-Pop
相关产品推荐
相关产品推荐

