Python基于CSV列取值的函数仅首次生效的问题如何解决?
问题原因
csv.reader是迭代器对象,第一次遍历完成后,关联的文件指针已经移动到文件末尾,第二次遍历时没有新的行可以读取,循环不会执行,直接返回你设置的初始值0。- 原有代码还有两个可优化点:一是匹配到目标ID后没有跳出循环,会无效遍历剩余所有行;二是文件打开后没有主动关闭,存在资源泄漏风险。
优化方案
根据CSV文件大小可以选择两种实现方式:
方案1:预加载数据到内存(推荐,适合绝大多数中小CSV场景)
提前把CSV数据读取为字典,每次调用直接查询字典,仅需一次IO操作,多次调用效率极高:
import csv # 仅需执行一次,加载所有CSV数据到字典 def load_csv_data(file_path): id_map = {} # 用with语法自动管理文件关闭 with open(file_path, newline='', encoding='utf-8') as f: # 你的CSV是制表符分隔,需指定delimiter参数,否则默认按逗号分割会读错列 reader = csv.reader(f, delimiter='\t') next(reader) # 跳过表头行 for row in reader: if row: # 跳过空行 id_map[row[0]] = row[1] return id_map def get_value(target_id, data_dict): # 找不到目标ID时返回0,和原有逻辑一致 return data_dict.get(target_id, 0) # 初始化数据 data_dict = load_csv_data("test.csv") # 多次调用均正常返回 print(get_value("5", data_dict)) # 输出21 print(get_value("5", data_dict)) # 输出21
方案2:每次调用重新读文件(适合超大CSV,内存无法放下全量数据的场景)
每次调用都重新打开文件遍历,缺点是每次调用都有磁盘IO开销,效率较低:
import csv def get_value(target_id, file_path="test.csv"): with open(file_path, newline='', encoding='utf-8') as f: reader = csv.reader(f, delimiter='\t') next(reader) for row in reader: if row and row[0] == target_id: # 匹配到直接返回,无需遍历剩余行 return row[1] # 遍历完未找到返回0 return 0 print(get_value("5")) # 输出21 print(get_value("5")) # 输出21
内容的提问来源于stack exchange,提问作者Iwishworldpeace
相关产品推荐
相关产品推荐

