Python实现CSV文件水果与ID匹配的代码问题求助
问题分析与修复
你的代码主要存在以下几个问题:
- CSV读取器只能遍历一次:
csv.reader基于文件对象创建,文件指针遍历到末尾后就不会再回到开头,所以第一个水果循环时读完了所有ID行,后续循环里for row in reader不会执行任何内容。 - 换行符未处理:
readlines()读取的每一行末尾带有换行符\n,导致fruit_name和ID文件里的水果名称(无换行符)无法匹配,同时打印时会出现空行。 - 参数未合理使用:函数参数
fruits被重新赋值,完全没用到传入的实参,逻辑冗余。 - 文件未正确关闭:直接用
open()打开文件后没有关闭,存在资源泄漏风险。
修正后的代码
import csv def find_id(user_fruits_path, fruit_ids_path): # 先把ID文件的内容加载成字典,方便快速查找 fruit_id_map = {} with open(fruit_ids_path, encoding="utf-8") as ids_file: reader = csv.reader(ids_file, delimiter=';') for row in reader: # 把水果名称转小写作为键,避免大小写问题 fruit_id_map[row[1].lower()] = row[0] # 读取用户水果文件并匹配ID with open(user_fruits_path, encoding="utf-8") as user_fruits_file: for fruit_name in user_fruits_file: # 去除换行符并转小写 cleaned_fruit = fruit_name.strip().lower() if cleaned_fruit in fruit_id_map: print(f"{fruit_id_map[cleaned_fruit]} {cleaned_fruit.capitalize()}") # 调用函数传入文件路径 find_id("list_of_users_fruits.csv", "list_of_fruit_ids.csv")
关键修改说明
- 使用字典存储ID映射:一次性把ID文件的内容加载到字典中,后续匹配时直接通过键查找,效率更高,也避免了文件指针遍历一次就失效的问题。
- 处理换行符:用
strip()去除每行末尾的换行符和空白字符,确保名称匹配准确。 - 大小写统一:把水果名称都转成小写进行匹配,避免大小写差异导致的匹配失败。
- 上下文管理器
with:自动管理文件的打开和关闭,无需手动调用close(),更安全规范。 - 明确参数传递:直接传入文件路径作为参数,函数逻辑更清晰,复用性更强。
运行修正后的代码,就能得到你预期的输出:
123 Apple 420 Banana 69430 Orange 314 Tomato
内容的提问来源于stack exchange,提问作者Slow Keys GT
相关产品推荐
相关产品推荐

