如何利用变量匹配文件名?多测试目录患者文件批量处理优化
优化患者多类型文件匹配的方案
问题背景
每个患者对应多组文件,文件名里都包含患者ID和文件类型标识。需要按患者ID遍历,在test_A、test_B这类测试子目录中找到对应患者的对应类型文件。之前用嵌套循环匹配ID的方式效率很低,现在要处理的文件类型增加到4-5种,嵌套逻辑越来越乱;之前试通用配符时,变量patient_ID被当成字面量识别,求优化方法。
文件目录结构如下:
test_A/ ├─ pat_1_test_A_343980235 ├─ pat_2_test_A_343958030 ├─ pat_3_test_A_4539830 test_B/ ├─ pat_1_test_B_934292 ├─ pat_2_test_B_2495345 ├─ pat_3_test_B_2948298 ...
当前低效代码:
for file_A in glob.glob(base_dir + 'test_A'): id = file_A.split('pat-')[-1].split('_test')[0] for file_B in glob.glob(base_dir + 'test_B'): if id in file_B: ... # 执行file_A和file_B相关操作
优化方案1:用字典按患者ID统一分组
先把所有文件按患者ID归类到字典里,之后直接遍历字典处理每个患者的所有文件,彻底避免嵌套循环,后续加新的文件类型也只需要在列表里加个元素就行。
实现步骤
- 定义需要处理的测试类型列表(比如
['test_A', 'test_B', 'test_C']) - 初始化一个字典,键是患者ID,值是该患者各类文件的路径字典
- 遍历每个测试类型目录,提取每个文件的患者ID,把文件路径存入对应ID的条目
- 遍历字典,对每个患者的所有文件执行操作
代码示例
import glob import os base_dir = "./" # 替换成你的实际基础路径 test_types = ['test_A', 'test_B'] # 要处理的测试类型,新增类型直接加在这里 # 初始化存储患者文件的字典 patient_files = {} for test_type in test_types: # 匹配当前测试类型下的所有文件 file_pattern = os.path.join(base_dir, test_type, "*") for file_path in glob.glob(file_pattern): filename = os.path.basename(file_path) # 提取患者ID(这里用split适配现有文件名,更可靠的话可以用正则) patient_id = filename.split('_test')[0].split('pat_')[-1] # 如果患者ID不在字典里,先初始化空字典 if patient_id not in patient_files: patient_files[patient_id] = {} # 把当前文件存入对应测试类型的条目 patient_files[patient_id][test_type] = file_path # 遍历每个患者的文件集合 for patient_id, files in patient_files.items(): # 可选:确保该患者有所有需要的测试文件,避免缺失文件报错 if all(tt in files for tt in test_types): file_a = files['test_A'] file_b = files['test_B'] # 这里替换成你的实际处理逻辑 print(f"处理患者{patient_id}: {file_a}, {file_b}")
优化方案2:直接用glob按患者ID匹配文件
如果已经能拿到明确的患者ID列表,可以直接构造带变量的glob路径,跳过嵌套循环,直接定位每个患者的各类文件。
实现步骤
- 先从某个测试目录(比如
test_A)提取所有患者ID - 对每个患者ID,直接构造各测试类型的文件匹配模式,用glob获取文件路径
代码示例
import glob import os base_dir = "./" # 先从test_A目录提取所有患者ID test_a_files = glob.glob(os.path.join(base_dir, 'test_A', "*")) patient_ids = [] for file_path in test_a_files: filename = os.path.basename(file_path) patient_id = filename.split('_test')[0].split('pat_')[-1] patient_ids.append(patient_id) # 去重,避免重复处理同一个患者 patient_ids = list(set(patient_ids)) # 遍历每个患者ID,直接匹配对应文件 for pid in patient_ids: # 构造各测试类型的文件匹配模式 file_a_list = glob.glob(os.path.join(base_dir, 'test_A', f"pat_{pid}_test_A*")) file_b_list = glob.glob(os.path.join(base_dir, 'test_B', f"pat_{pid}_test_B*")) # 确保找到文件再处理(假设每个患者每个测试类型只有一个文件) if file_a_list and file_b_list: file_a = file_a_list[0] file_b = file_b_list[0] # 替换成你的处理函数或逻辑 print(f"处理患者{pid}: {file_a}, {file_b}")
额外建议
- 提取患者ID时,用正则表达式更可靠,能适配文件名的小变化,比如:
import re match = re.search(r'pat_(\d+)_test', filename) if match: patient_id = match.group(1) - 如果存在患者缺失某类测试文件的情况,建议在代码里加判断,要么跳过该患者,要么记录日志方便后续排查。
内容的提问来源于stack exchange,提问作者user20501139
相关产品推荐
相关产品推荐

