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

Snakemake通配符使用问题:动态处理数据集与子集分区

Snakemake通配符实现动态输入输出的解决方案

问题背景

你的输入数据目录结构如下:

data/
├─ somedataset/
│  ├─ somesubset.csv
│  ├─ someothersubset.csv
├─ seconddataset/
│  ├─ somesubsetofsecond.csv
│  ├─ yetanothersubset.csv
│  ├─ andyetanothersubset.csv

需求是无需手动指定数据集和子集,自动将每个输入CSV分割为2个分区,生成对应输出结构:

output/
├─ somedataset/
│  ├─ somesubset_01.csv
│  ├─ somesubset_02.csv
│  ├─ someothersubset_01.csv
│  ├─ someothersubset_02.csv
├─ seconddataset/
│  ├─ somesubsetofsecond_01.csv
│  ├─ somesubsetofsecond_02.csv
│  ├─ yetanothersubset_01.csv
│  ├─ yetanothersubset_02.csv
│  ├─ andyetanothersubset_01.csv
│  ├─ andyetanothersubset_02.csv

你之前尝试的错误分析

  1. 第一种写法报错No values given for wildcard 'dataset'
    你定义了带通配符的规则,但Snakemake不知道要处理哪些具体的dataset和subset——它需要明确的目标文件列表,而不是只知道规则模板。

  2. 第二种写法报错No rule to produce 1
    代码里的subsets变量未定义,且循环生成规则的方式冗余易出错,不符合Snakemake的最佳实践。

正确实现步骤

1. 自动发现所有输入文件

用Python的glob模块自动扫描data/目录下的所有CSV文件,提取对应的dataset和subset名称,无需手动写死。

2. 定义顶层all规则

Snakemake需要明确的目标集合,all规则用来指定所有要生成的输出文件,作为工作流的入口。

3. 单条通配符规则处理单个子集

用通配符{dataset}和{subset}匹配每个输入文件,输出对应的两个分区文件,确保规则逻辑简洁通用。

完整代码示例

import glob
import os

# 自动扫描所有输入CSV文件
input_files = glob.glob("data/*/*.csv")

# 从输入文件路径中提取dataset和subset名称,生成对应输出路径
def get_output_files():
    outputs = []
    for f in input_files:
        parts = os.path.normpath(f).split(os.sep)
        dataset = parts[1]
        subset = os.path.splitext(parts[2])[0]
        outputs.append(f"output/{dataset}/{subset}_01.csv")
        outputs.append(f"output/{dataset}/{subset}_02.csv")
    return outputs

wildcard_constraints:
    dataset=r"\w+",
    subset=r"\w+"

rule all:
    # 所有要生成的输出文件作为工作流目标
    input:
        get_output_files()

rule split_subset:
    input:
        "data/{dataset}/{subset}.csv"
    output:
        "output/{dataset}/{subset}_01.csv",
        "output/{dataset}/{subset}_02.csv"
    shell:
        # 注意:需确保test.py脚本能接收输入路径和两个输出路径,实现分割逻辑
        "python scripts/test.py {input} {output}"

关键说明

  • get_output_files()函数自动生成所有输出文件路径,避免手动维护列表,适配目录结构变化。
  • rule all是工作流的起点,Snakemake会根据它的输入反向推导需要执行的规则。
  • rule split_subset用通配符匹配每个输入子集,一次生成两个分区文件,实现逻辑复用。
  • 你的test.py脚本需要接收输入文件路径和两个输出文件路径,完成具体的分割逻辑(比如按行拆分、按字段拆分等)。

运行方式

在终端执行:

snakemake -j 4  # -j 指定并行任务数,可根据CPU核心数调整

内容的提问来源于stack exchange,提问作者user3170702

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 02:55:28