Python如何根据输入的产品名从txt文件提取对应商品价格?
问题原因
你的代码有3个核心逻辑错误,直接导致运行异常:
- 文件对象只能单次遍历:第一次用列表推导式遍历
text_file生成p_name列表时,文件读取指针已经移动到文件末尾,第二次再遍历text_file生成p_price时读不到任何内容,所以p_price从一开始就是空列表,这是所有场景下都输出[]的根本原因。 - 循环逻辑完全无效:你写的
while True块里,p_name == product_name_input只是做了一次无任何赋值、无结果存储的相等判断,没有做任何价格匹配操作,执行完判断就直接打印整个p_price列表然后跳出循环,完全没有实现“根据输入找对应价格”的逻辑。 - 数据结构选型不合理:把商品名和价格拆成两个独立列表存储,即使文件读取正常,也需要额外做索引对齐才能匹配到对应价格,很容易出现错位问题,用字典做键值对映射是更简单可靠的方案。
修复方案
- 读取文件时只做一次遍历,逐行解析同时提取商品名和价格,避免重复遍历文件导致读空
- 删除无意义的
while True死循环,不需要在这里套循环逻辑 - 用字典存储「商品名: 价格」的映射关系,查找时直接判断键是否存在即可,不需要做列表遍历匹配
- 读取每行内容时先去掉首尾的换行符、空格,避免因为隐藏字符导致商品名匹配失败
修复后完整代码
假设你的products.txt每行格式为编号, 商品名, 价格(比如1, shirt, 99),可直接运行以下代码:
# 获取用户输入,自动去掉首尾多余空格 product_name_input = input("Please enter products name: ").strip() product_map = {} # 单次遍历文件,构建商品-价格映射 with open("products.txt", "r", encoding="utf-8") as text_file: for line in text_file: # 去掉每行首尾空白、换行符后按分隔符拆分 line_items = line.strip().split(", ") # 跳过格式不符合要求的空行、坏行,避免报错 if len(line_items) < 3: continue name = line_items[1].strip() price = float(line_items[2].strip()) product_map[name] = price # 匹配查询逻辑 if product_name_input in product_map: print(f"The price of {product_name_input} is {product_map[product_name_input]}") else: print("That product does not exist")
原异常场景对应说明
- 输入存在的商品输出空列表:是因为
p_price本身就是二次遍历文件得到的空列表,无效循环直接打印了这个空列表,根本没有执行匹配价格的逻辑 - 输入不存在的商品先输出空列表再提示不存在:是因为你的打印空列表的逻辑写在了商品存在性判断的前面,不管商品是否存在都会先执行打印空列表的操作,才会走到不存在的提示分支
内容的提问来源于stack exchange,提问作者NMGITV
相关产品推荐
相关产品推荐

