如何实现根据用户输入提取CSV数据集对应菜品行信息?
解决Python读取indian_food.csv并查询菜品信息的问题
你的代码存在多个关键问题,导致无法正确获取目标行数据,以下是修正后的完整实现:
修正后的代码
import csv def read_dish(): # 用上下文管理器读取csv,自动处理文件关闭 with open('indian_food.csv', 'r', encoding='utf-8') as myfile: # 将csv解析为字典列表,每行对应一个菜品的字典 dish_list = list(csv.DictReader(myfile)) user_input = input('请输入菜品名称或其索引:\n').strip() target_row = None # 处理输入为索引的情况 if user_input.isdigit(): index = int(user_input) if 0 <= index < len(dish_list): target_row = dish_list[index] else: print(f'索引超出范围,数据集共有{len(dish_list)}条记录,索引范围0-{len(dish_list)-1}') # 处理输入为菜品名称的情况 else: for row in dish_list: if row['dish name'].strip().lower() == user_input.lower(): target_row = row break if not target_row: print(f'未找到名为"{user_input}"的菜品') # 找到目标行后格式化输出 if target_row: # 处理数据集中的空值(如NaN、-1) state = target_row['state'] if target_row['state'] != 'NaN' else '未知地区' region = target_row['region'] if target_row['region'] != 'NaN' else '未知区域' cook_time = f"{target_row['cook_time']}分钟" if target_row['cook_time'] != '-1' else '未知时长' output = (f"{target_row['dish name']} is made of {target_row['ingredients']}, and is a {target_row['diet']} dish. " f"It takes {cook_time} to cook. It is a {target_row['flavor_profile']} {target_row['course']} " f"from the state of {state}, which is the {region} region of India.") print(output) # 调用函数 read_dish()
关键修正点说明
- CSV解析优化:使用
csv.DictReader将每行数据转为字典,可直接通过列名(如row['dish name'])访问字段,解决原代码无法通过列名取值的问题。 - 输入分支处理:区分用户输入的是数字索引还是字符串菜品名,分别实现匹配逻辑,覆盖需求中的两种查询方式。
- 文件资源管理:用
with语句打开文件,自动完成文件关闭,避免资源泄漏。 - 异常与空值处理:增加索引越界、菜品不存在的提示,同时处理数据集中的
NaN和-1空值,避免输出异常内容。 - 输出格式修复:调整字符串拼接的语法,补充
made of后的空格,让输出完全匹配示例格式。
内容的提问来源于stack exchange,提问作者pat02CU
相关产品推荐
相关产品推荐

