Snakemake宏基因组分析读取样本目录fastq文件出现WildcardError求助
报错原因
你触发的WildcardError核心问题是:你把和样本绑定的R1/R2文件名当成了Snakemake的通配符使用,而规则的输出文件名里没有包含R1、R2通配符,Snakemake无法建立输出到输入的对应关系。
修复步骤
- 将样本元数据转为字典映射:原来直接读取的R1、R2是全局列表,无法和单个样本对应,需要转为以样本名为索引的键值对,方便根据样本名匹配对应的读段文件名。
- 使用输入函数获取对应读段文件:在规则的input块中通过lambda函数,根据当前匹配的
sample通配符,从字典中取出对应的R1/R2文件名,避免将R1/R2设为通配符。 - 修正shell命令的参数错误:你原代码中trimmomatic、kraken2的shell命令重复写入了
{input}占位符,会导致参数错误,同步修正。
修改后完整Snakefile代码
# 提取样本表信息,建立样本与读段文件的映射 import pandas as pd import os df = pd.read_csv("sample_table_test.csv") # 转为以样本名为key的字典 sample2r1 = dict(zip(df.library, df.r1_file)) sample2r2 = dict(zip(df.library, df.r2_file)) samples = df.library.to_list() print("Samples being processed:", samples) rule all: input: expand("{sample}.bracken", sample=samples), # Trimmomatic修剪双端读段 rule trim_reads: input: r1 = lambda wildcards: f"{wildcards.sample}/{sample2r1[wildcards.sample]}", r2 = lambda wildcards: f"{wildcards.sample}/{sample2r2[wildcards.sample]}", output: r1_trim = "{sample}/r1_trim_paired.fq.gz", r2_trim = "{sample}/r2_trim_paired.fq.gz", conda: "env.yaml", threads: 8 shell: "trimmomatic PE -threads {threads} {input.r1} {input.r2} {output.r1_trim} {output.r1_trim}.unpaired {output.r2_trim} {output.r2_trim}.unpaired SLIDINGWINDOW:4:30 LEADING:2 TRAILING:2 MINLEN:50" # Kraken2分类注释 rule kraken2: input: r1_trim = "{sample}/r1_trim_paired.fq.gz", r2_trim = "{sample}/r2_trim_paired.fq.gz", output: report = "{sample}_report.txt", classified = "{sample}_kraken_cseqs#.fq", conda: "env.yaml", threads: 1 shell: "kraken2 --gzip-compressed --paired --classified-out {output.classified} --db database/minikraken2_v1_8GB/ --report {output.report} --threads {threads} {input.r1_trim} {input.r2_trim}" # Bracken丰度估计 rule bracken: input: report = "{sample}_report.txt", output: "{sample}.bracken", conda: "env.yaml", shell: "bracken -d database/minikraken2_v1_8GB/ -i {input.report} -o {output} -r 150"
其他注意点
- 我把修剪后的输出文件名统一改成了固定的
r1_trim_paired.fq.gz、r2_trim_paired.fq.gz,不需要再保留原始文件名的后缀,避免后续规则不必要的依赖关联 - 线程数单独提出来放到
threads字段,更符合Snakemake的规范,方便后续资源调度 - 原代码中trimmomatic的输出参数错误已经修正,示例里会自动丢弃未配对的读段,如果你需要保留可以新增对应的输出字段配置即可
内容的提问来源于stack exchange,提问作者Danny Wolf
相关产品推荐
相关产品推荐

