Snakemake 中 glob_wildcards() 使用注意事项总结
Snakemake 中 glob_wildcards()
使用注意事项总结 🚀
在 Snakemake 中,经常使用 glob_wildcards()
来自动提取通配符 (wildcard) 匹配的文件名参数。
1️⃣ 基本用法
from snakemake.io import glob_wildcardsgw = glob_wildcards("raw/{A_B}/Technical_replicate_{REP}/{ID}.gz", followlinks=True)print("A_B =", gw.A_B)
print("REP =", gw.REP)
print("ID =", gw.ID)
2️⃣ 不能使用 *
⚠️ 大坑提醒:
glob_wildcards()
里面不能使用*
通配符- 必须使用
{wildcard}
形式,写成{{WILDCARD}}
(在 f-string 里)
例如:
✅ 正确:
glob_wildcards("raw/{A_B}/Technical_replicate_{REP}/{ID}.gz")
❌ 错误(不要用 *
):
glob_wildcards("raw/*/Technical_replicate_*/.gz")
为什么?
👉 glob_wildcards()
是 Snakemake 专门的 wildcard 解析函数,它是靠 {}
来绑定 wildcard 名字的,
如果用 *
,Snakemake 根本不知道要解析成什么 wildcard。
3️⃣ f-string 中 {}
要写成 {{}}
如果在 f-string 里拼接路径,注意:
- f-string 自身用
{}
做变量 - 要嵌套 Snakemake 的
{WILDCARD}
,需要写成{{WILDCARD}}
示例 ✅:
gw = glob_wildcards(f"{config['raw']}/{{A_B}}/Technical_replicate_{{REP}}/{{ID}}.gz", followlinks=True)
- 外层
f"..."
是 Python f-string {{RBP_CELL}}
里面的{{
→ 输出{
- Snakemake 看到
raw/{RBP_CELL}/...
才会正确解析 wildcard!
4️⃣ expand()
时要用 gw.A_B
glob_wildcards()
返回的是一个 named tuple,例如:
gw.A_B
gw.REP
gw.ID
⚠️ 不要写 A_B=A_B
,否则会 NameError!
✅ 正确写法:
rule all:input:expand("processed_bf/{A_B}/C.bed", A_B=gw.A_B)
5️⃣ 完整示例 ✅
# 提取 wildcard
gw = glob_wildcards(f"{config['raw']}/{{A_B}}/Technical_replicate_{{REP}}/{{ID}}.gz", followlinks=True)print("A_B =", gw.A_B)
print("REP =", gw.REP)
print("ID =", gw.ID)# 定义 all 规则
rule all:input:expand("processed_bf/{A_B}/C.bed", A_B=gw.A_B)
总结 🌟
正确用法 | 错误用法 |
---|---|
使用 {WILDCARD} | 使用 * 通配符 |
f-string 中用 {{WILDCARD}} | 直接用 {WILDCARD} |
expand 里用 gw.A_B | 用未定义变量 A_B |
6️⃣ 参考
- Snakemake Docs - Wildcards
- Snakemake Docs - glob_wildcards