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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 00:15:43