You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何利用变量匹配文件名?多测试目录患者文件批量处理优化

优化患者多类型文件匹配的方案

问题背景

每个患者对应多组文件,文件名里都包含患者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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 16:02:50