Python实现get_mapping函数过滤无效ID错误输出问题求助
代码修改方案
无效条目产生的核心原因是未对非Ensembl ID列的空值、空白值做过滤,空字符串会被直接作为键存入字典,导致出现无有效键的映射行。以下是修改后的可直接运行的代码:
def get_mapping(map_file): # with语句自动管理文件资源,无需手动关闭 with open(map_file, "r", encoding="utf-8") as f: mapping_list = [] # 读取表头计算需要生成的字典数量 header = f.readline().split() col_count = len(header) - 1 for _ in range(col_count): mapping_list.append({}) for line in f: line = line.strip("\n").split("\t") # 跳过列数和表头不匹配的脏数据行 if len(line) != len(header): continue ensembl_id = line[0] for idx in range(col_count): target_id = line[idx+1].strip() # 仅非空的ID才存入字典,过滤空值、空白值 if target_id: mapping_list[idx][target_id] = ensembl_id return mapping_list # 测试调用 if __name__ == "__main__": get_mapping('mapping/rno.map') get_mapping('mapping/mmu.map') get_mapping('mapping/hsa.map')
主要修改点
- 新增字段空白处理逻辑:所有非Ensembl ID列先做首尾去空白,避免空格、制表符等空白字符被判定为有效ID
- 新增非空校验:只有非空的目标ID才会被存入字典,直接过滤空字符串键的无效条目
- 新增脏数据行过滤:列数和表头不一致的异常行直接跳过,避免索引报错和无效数据入库
- 改用with语句管理文件句柄,避免忘记关闭文件导致的资源泄漏
- 新增入口判断,避免模块被导入时重复执行测试代码
内容的提问来源于stack exchange,提问作者Best Video g
相关产品推荐
相关产品推荐

