如何从文本文件表格生成列表的列表字典?修复问题并支持多文件
文本表格数据提取解决方案
问题说明
需要从制表符分隔的文本表格中提取SAMPLE_ID、Gene ID和Flag三个字段,生成包含目标字段的结构化数据,但现有两段代码存在以下问题:
- 第一段代码:将表头纳入结果,且以
SAMPLE_ID作为字典键,后续行覆盖前序行,仅保留最后一条数据 - 第二段代码:使用默认
split()分割导致列索引错位(如Gene ID被拆分为两个元素),同样因字典键覆盖仅保留最后一条数据
单个文件处理的正确实现
使用csv.DictReader可直接通过列名提取数据,避免索引错位,同时保留所有条目:
import csv # 存储所有提取结果的列表 result_list = [] file_path = '/data/TB/WA_dirty_prep_reports/WA0911399-WAPHL-M5130-230329_S17_target_region_coverage.txt' with open(file_path, 'r') as f: # 自动识别表头,按列名访问数据 reader = csv.DictReader(f, delimiter='\t') for row in reader: # 构造目标字段的字典并添加到列表 entry = { 'SAMPLE_ID': row['SAMPLE_ID'], 'Gene ID': row['Gene ID'], 'Flag': row['Flag'] } result_list.append(entry) # 打印结果 for item in result_list: print(item)
代码说明
csv.DictReader自动读取第一行作为表头,后续每行数据可通过列名直接访问,无需手动处理索引- 每行构造独立字典存入列表,不会出现数据覆盖问题
- 指定
delimiter='\t'匹配文本表格的制表符分隔格式
如果需要按SAMPLE_ID分组存储(同一样本的所有基因条目放在一起),可改用字典嵌套列表的结构:
import csv # 按样本ID分组,键为SAMPLE_ID,值为该样本的基因条目列表 grouped_result = {} file_path = '/data/TB/WA_dirty_prep_reports/WA0911399-WAPHL-M5130-230329_S17_target_region_coverage.txt' with open(file_path, 'r') as f: reader = csv.DictReader(f, delimiter='\t') for row in reader: sample_id = row['SAMPLE_ID'] entry = { 'Gene ID': row['Gene ID'], 'Flag': row['Flag'] } # 样本已存在则追加条目,否则创建新列表 if sample_id in grouped_result: grouped_result[sample_id].append(entry) else: grouped_result[sample_id] = [entry] # 打印分组结果 for sample, entries in grouped_result.items(): print(f"样本 {sample}:") for entry in entries: print(f" {entry}")
文件夹内批量处理实现
使用os模块遍历指定文件夹下的所有文本文件,逐个处理并合并结果:
import csv import os # 目标文件夹路径 folder_path = '/data/TB/WA_dirty_prep_reports/' # 存储所有文件的结果 all_results = [] # 遍历文件夹下的所有文件 for filename in os.listdir(folder_path): # 仅处理txt格式文件 if filename.endswith('.txt'): file_path = os.path.join(folder_path, filename) with open(file_path, 'r') as f: reader = csv.DictReader(f, delimiter='\t') for row in reader: entry = { 'SAMPLE_ID': row['SAMPLE_ID'], 'Gene ID': row['Gene ID'], 'Flag': row['Flag'] } all_results.append(entry) # 输出所有结果 for item in all_results: print(item)
批量处理说明
os.listdir(folder_path)获取文件夹下所有文件名- 通过
endswith('.txt')筛选目标格式文件 - 每个文件的处理逻辑与单个文件一致,结果统一存入
all_results列表
内容的提问来源于stack exchange,提问作者natural_d
相关产品推荐
相关产品推荐

