如何从CSV提取变量定义Snakemake输入文件并调用bwa规则?
解决Snakemake中从CSV提取样本并批量运行BWA的问题
看起来你在处理从CSV读取样本文件路径并在Snakemake中批量运行BWA的问题,核心问题出在CSV的读取方式、样本名的提取以及通配符与输入文件的映射上。我来帮你一步步修正代码:
问题分析
- 你的
test.csv没有表头,直接是一行两个fastq路径,但默认pandas.read_csv会把第一行当作表头,导致读取的数据不符合预期。 rule all中直接用samplesData作为expand的sample参数,这会传入整个DataFrame,而不是单个样本名。bwa_map的input没有正确关联通配符sample到对应的fastq文件。
修正后的完整Snakefile
import pandas import os # 读取配置中的CSV路径 input_table = config["samples"]["summaryFile"] # 读取CSV,因为没有表头,指定header=None samplesData = pandas.read_csv(input_table, header=None) # 提取第一行的所有fastq文件路径 fastq_files = samplesData.iloc[0].tolist() # 从fastq路径中提取样本名(比如从data/samples/A.fastq得到A) sample_names = [os.path.splitext(os.path.basename(f))[0] for f in fastq_files] # 建立样本名到fastq文件的映射字典 sample_to_fastq = dict(zip(sample_names, fastq_files)) rule all: # 用提取到的样本名生成所有需要的bam文件目标 input: expand("mapped_reads/{sample}.bam", sample=sample_names) rule bwa_map: input: # 参考基因组 ref="data/genome.fa", # 根据通配符sample从字典中获取对应的fastq文件 reads=lambda wildcards: sample_to_fastq[wildcards.sample] output: "mapped_reads/{sample}.bam" shell: # 注意input[0]是参考基因组,input[1]是fastq文件,顺序要对应bwa mem的参数 "bwa mem {input.ref} {input.reads} | samtools view -Sb - > {output}"
关键改动说明
- CSV读取修正:添加
header=None确保pandas把第一行当作数据而不是表头,然后用iloc[0]取出所有fastq路径。 - 样本名提取:通过
os.path.basename获取文件名,再用splitext去掉后缀,得到干净的样本名(A、B)。 - 样本-文件映射:用字典
sample_to_fastq建立样本名到对应fastq文件的关联,这样lambda通配符可以快速找到对应的输入文件。 - Input结构优化:把input拆分为
ref和reads两个命名项,让shell命令更清晰,避免索引出错。
这样修改后,Snakemake会逐个为每个样本(A、B)调用bwa_map规则,生成对应的bam文件,完全符合你的需求。
内容的提问来源于stack exchange,提问作者nicoluca
相关产品推荐
相关产品推荐

