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
相关产品推荐
相关产品推荐

