如何在Snakemake中基于文本文件的文件名列表定义输出?
Snakemake实现指定文件批量复制的解决方案
需求背景
作为Snakemake新手,要完成以下任务:
- 从总文件夹
source_dir复制指定文件到新目录target_dir - 需复制的文件名存于
files.txt,每行一个文件名 - 已有可用bash脚本:
cat files.txt | xargs -I {} cp ./source_dir/{} ./target_dir/
但不知道如何让Snakemake正确识别输出为target_dir+files.txt中的文件名,最初尝试用Python生成目标路径列表时,规则提示缺少输入文件,调整后问题解决,以下是实现过程。
实现步骤
1. 关联源文件与目标文件路径
在Snakefile开头添加代码,读取files.txt并生成源、目标文件的路径对,确保每个目标文件对应正确的源文件:
file_pairs = [] with open("files.txt", "r") as f: for line in f: filename = line.strip() if filename: # 跳过空行 source_path = f"source_dir/{filename}" target_path = f"target_dir/{filename}" file_pairs.append( (source_path, target_path) )
2. 定义总目标规则
用rule all指定所有最终需要生成的目标文件,让Snakemake明确任务的终点:
rule all: input: [target for source, target in file_pairs]
3. 编写文件复制规则
编写规则处理单个文件复制,通过通配符匹配目标路径,并自动映射对应的源路径:
rule copy_specified_files: input: lambda wildcards: next(source for source, target in file_pairs if target == wildcards.output) output: "{output}" shell: "cp {input} {output}"
问题解决关键点
最初报错“缺少输入文件”,是因为只生成了目标路径列表,但没将每个目标路径与对应的源路径关联。Snakemake需要明确每个输出对应的输入依赖,通过上述路径对的关联,规则能正确找到每个目标文件对应的源文件,解决了依赖缺失的问题。
内容的提问来源于stack exchange,提问作者sesben
相关产品推荐
相关产品推荐

