Snakemake如何将download规则输出限制为指定文件名列表?
解决方案
你可以通过给规则添加**通配符约束(wildcard_constraint)**限制该规则仅匹配files_to_url_dict中存在的文件名,具体实现如下:
方法1:通配符约束(最推荐)
通过正则约束file通配符的取值范围,仅当通配符匹配字典中的键时,该规则才会被触发:
import re rule download_file: output: file="{file}" # 新增通配符约束 wildcard_constraint: file = "|".join(re.escape(fname) for fname in files_to_url_dict.keys()) params: url=lambda wildcards: files_to_url_dict[wildcards.file], # 注意:wget保存文件需要用大写的-O,小写-o是指定日志输出路径 shell: """wget "{params.url}" -O "{output.file}""""
re.escape用来转义文件名中可能存在的正则特殊字符(比如.、*等),避免匹配异常- 该约束是在通配符匹配阶段生效,不会影响其他规则的正常匹配
方法2:异常过滤(备选)
如果不想引入正则,也可以在参数调用时判断,如果文件名不在字典中直接抛出异常,Snakemake遇到规则参数生成异常时会自动跳过该规则,尝试匹配其他规则:
rule download_file: output: file="{file}" params: url=lambda wildcards: files_to_url_dict[wildcards.file] if wildcards.file in files_to_url_dict else exec("raise ValueError"), shell: """wget "{params.url}" -O "{output.file}""""
注意:该方法效率低于通配符约束,仅适合字典规模很小的场景使用
额外修正提示
你原代码中的wget命令使用了小写-o参数,该参数是指定日志输出路径,下载内容保存到指定文件需要使用大写-O参数,否则会出现下载内容保存错误的问题。
内容的提问来源于stack exchange,提问作者Hoeze
相关产品推荐
相关产品推荐

