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

Snakemake中如何让glob_wildcards()按字母顺序获取文件?

解决Snakemake中glob_wildcards()结果的排序问题

嘿,这个问题我之前也碰到过!核心原因是glob_wildcards()返回的通配符结果是文件系统原生的返回顺序(不同系统、不同文件创建顺序都会影响这个结果),不是默认按字母排序的,所以才导致concat出来的内容顺序混乱。解决起来其实超级简单,只需要手动给样本列表做个排序就行。

具体修改方法

直接把定义SAMPLES的那一行改成排序后的版本:

file_pattern = 'dir_test/{sample}.txt'
FILES = glob_wildcards(file_pattern)
# 对样本列表按字母顺序排序
SAMPLES = sorted(FILES.sample)

rule all:
    input: expand(file_pattern, sample=SAMPLES), "concat.txt"

rule concat:
    input: expand("dir_test/{sample}.txt", sample=SAMPLES),
    output: "concat.txt"
    shell: """ 
        cat {input} > {output}
    """

为什么这能解决问题?

glob_wildcards()返回的FILES.sample本质是一个可迭代对象(逻辑上和列表类似),Python内置的sorted()函数会默认按照字符串的字母顺序对它排序。这样后续expand生成的文件路径列表就会是Sample1→Sample2→Sample3→Sample4的顺序,cat命令自然也就按这个顺序拼接内容了。

额外小技巧

如果不想修改全局的SAMPLES变量,也可以在expand的时候直接传入排序后的结果,比如:

expand("dir_test/{sample}.txt", sample=sorted(FILES.sample))

不过前者的方式更高效——毕竟只需要排序一次,后者如果在多个规则里用expand的话会重复执行排序操作。

运行修改后的代码再查看concat.txt,内容就会是规整的字母顺序啦:

$ cat concat.txt
This is Sample1
This is Sample2
This is Sample3
This is Sample4

内容的提问来源于stack exchange,提问作者mimi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 00:07:27